Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1051919
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: LINUX

2015-12-02 10:34:37

一,使用strace


# tar -xjvf strace-4.5.15.tar.bz2  //解压strace的源码
# cd strace-4.5.15
# patch -p1 < ../strace-fix-arm-bad-syscall.patch  //给strace打上补丁
(Stripping trailing CRs from patch.)
patching file syscall.c
Hunk #1 succeeded at 1045 (offset 32 lines).


# ./configure --host=arm-linux --target=arm-linux CC=/home/wangxc/linux/toolchain/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc LD=/home/wangxc/linux/toolchain/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-ld RANLIB=/home/wangxc/linux/toolchain/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-ranlib
# ./configure --host=arm-linux --target=arm-linux CC=/home/wangxc/linux/toolchain/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc LD=/home/wangxc/linux/toolchain/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-ld RANLIB=/home/wangxc/linux/toolchain/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-ranlib


# ./configure --host=arm-linux CC=/home/wangxc/linux/toolchain/crosstools_4.4.3_softfloat/bin/arm-linux-gcc //使用这个时,make失败。
# ./configure --host=arm-linux CC=/home/wangxc/linux/toolchain/crosstools_3.4.1_softfloat/arm-linux/gcc-3.4.1-glibc-2.3.3/bin/arm-linux-gcc  //使用这个编译器才可以,2.6.13内核也要用这个编译才行
# ./configure --host=arm-linux CC=/home/wangxc/linux/toolchain/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc  //使用这个编译器才可以
--host=arm-linux : 表示编译出来的程序,将在哪里执行? 默认是PC机
--target=arm-linux : 为什么系统做的程序??


...
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands

注意 : 我之前用4.4.3 交叉编译器,编译2.6.30 内核,跑开发板,用3.4.1 或者 3.4.5 交叉编译器,编译strace源码,
在arm开发板上执行strace的时候:
# strace 
-/bin/sh: strace: not found
这个是不对的,应该使用统一的交叉编译器编译版本:
现在用3.4.1 交叉编译器 编译 2.6.13 内核,也用3.4.1 交叉编译器 编译strace,开发板就可以识别它了


# /home/wangxc/linux/toolchain/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-strip ./strace  //这个是修剪,使可执行文件变小。


ubuntu目录下:查找错误
# file strace   //查看可执行文件的相关信息
strace: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped
# ldd strace  //查看可执行文件依赖的库
        not a dynamic executable
# readelf -d strace | grep NEEDED  //查看可执行文件依赖的库
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]


# make //编译出strace命令
# cp strace /home/wangxc/linux/rootfs/nfs_2.6.13/bin  //拷贝到开发板PATH目录



测试使用strace:
# cd /wxc/driver/chardriver/ko
# insmod leddriver.ko
# mknod /dev/leddriver c 253 0
# cd /wxc/app/led


//使用strace命令来跟踪应用程序:在运行中,调用了哪些系统调用??
# strace ./leddrivertest 0 3   //跟踪的信息打印在屏幕上
# strace -o log.txt ./leddrivertest 0 3 //跟踪的信息输出到log.txt文件
# cat log.txt  
execve("./leddrivertest", ["./leddrivertest", "0", "3"], [/* 9 vars */]) = 0   //表示shell会执行应用程序: ./leddrivertest
uname({sys="Linux", node="EmbedSky", ...}) = 0
brk(0)                                  = 0x11000
open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = -1 ENOENT (No such file or directory)
open("/lib/v4l/half/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/v4l/half", 0xbebb02ec)     = -1 ENOENT (No such file or directory)
open("/lib/v4l/libc.so.6", O_RDONLY)    = -1 ENOENT (No such file or directory)
stat64("/lib/v4l", 0xbebb02ec)          = -1 ENOENT (No such file or directory)
open("/lib/half/libc.so.6", O_RDONLY)   = -1 ENOENT (No such file or directory)
stat64("/lib/half", 0xbebb02ec)         = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1a\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\270p\1\000"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0777, st_size=1407357, ...}) = 0
old_mmap(NULL, 1285720, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40022000
mprotect(0x4014e000, 56920, PROT_NONE)  = 0
old_mmap(0x40152000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x128000) = 0x40152000
old_mmap(0x4015a000, 7768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4015a000
close(3)                                = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40019000
open("/dev/leddriver", O_RDWR|O_TRUNC)  = 3   //表示得到文件描述符3
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(5, 1), ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4001a000
write(1, "APP:open fd=[3]\n", 16)       = 16   //把后面的字符"APP:open fd=[3]\n",写到文件1中,写16个字节。
write(1, "APP:led_no=[0] time=[3]\n", 24) = 24
ioctl(3, 0, 0x3)                        = 0
write(1, "APP:ioctl ret=[0]\n", 18)     = 18
close(3)                                = 0
munmap(0x4001a000, 4096)                = 0
exit_group(0)                           = ?


//strace的工作原理:
strace是个父进程,会创建子进程:./leddrivertest 0 3
所有的系统调用,都是通过 执行swi指令 : (open 对应 : swi #val1)(write 对应 : swi #val2)(read 对应 : swi #val3)来完成的,
这条指令会导致系统发生swi异常,进入到内核态。
在swi异常处理函数里面,就会调用(open 对应 : swi #val1 对应 sys_open)(write 对应 : swi #val2 对应 sys_write)(read 对应 : swi #val3 对应 sys_read)






一,使用gdb
# tar -xjvf gdb-6.7.tar.bz2  //这个不可以
# tar -xjvf gdb-7.4.tar.bz2  //这个可以编译出结果
# cd gdb-6.7
# ./configure --help
# ./configure --target=arm-linux //使用这个配置就行
# ./configure --target=arm-linux CC=/home/wangxc/linux/toolchain/crosstools_3.4.1_softfloat/arm-linux/gcc-3.4.1-glibc-2.3.3/bin/arm-linux-gcc
# make //编译出gdb命令
# make install prefix = $PWD/tmp //编译出gdb命令
































































阅读(632) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~