您的位置:首页 > 运维架构 > Linux

学习笔记 --- LINUX 应用调试之使用strace命令追踪系统调用

2014-04-04 11:45 1006 查看
一、安装:需要两个文件:strace-4.5.15.tar.bz2和strace-fix-arm-bad-syscall.patch

1、解压:tar xvf strace-4.5.15.tar.bz2

2、打补丁:cd strace-4.5.15

                     patch -p1 < ../strace-fix-arm-bad-syscall.patch

3、配置:./configure --host=arm-linux CC=arm-linux-gcc

4、编译:make

5、拷贝:将strace文件拷贝到开发板根文件系统的bin目录下

 

二、选项说明

-f:除了跟踪当前进程外,还跟中其子进程

-o file:将输出信息写到文件file中,而不是显示到标准错误输出(stderur)

-p pid:绑定到一个由pid对应的正在运行的进程。此参数常用来调试后台进程

-t:打印各个系统调用被调用时的绝对时间,想观察程序各个部分的执行时间时可以使用这个选项

-tt:与-t选项相似,打印的时间精度为us

-r:与-t选项相似,打印的时间为相对时间

例子:strace -o log.txt ./firstdrvtest on

其中-o log.txt表示信息输出到文件log.txt里面

./firstdrvtest on是被跟踪的进程

三、原理说明

strace主要用于跟踪系统调用,那么是如何跟踪的呢?我们来分析一下:

首先strace会作为一个父进程,而被跟踪的系统调用作为子进程,我们用open函数来举个例子:

我们知道在用户空间的open函数,它会调用一个swi指令加上一个值,这个指令会导致一个异常,然后进入内核态,在这个异常处理函数里面就会根据那个值找到并调用sys_open这个函数,下面我们就来好好的来看一个这个异常处理函数:

首先在内核里搜索:vector_swi,找到:

ENTRY(vector_swi)

@测试本系统调用是被跟踪,如果被跟踪的话就调用:__sys_trace

tst ip, #_TIF_SYSCALL_TRACE  @ are we tracing syscalls?

bne __sys_trace

          syscall_trace

这个函数用于向父进程,也就是strace发送一个信号,等待strace反应后才会继续往下执行。

我们来总结一下:

strace作为父进程去调用open函数,open函数会产生一个异常然后进入到内核里面,在内核里面首先检查该系统调用没有有被跟踪,如果被跟踪的话就会向strace发送一个信号,并等待回应,strace收到信号之后就可以把相应的信息记录下来并且给出应答,系统调用收到应答之后继续执行!

四、移植:busybox-1.20.0并且使用strace解决问题

1、到官网下载:http://www.busybox.net/downloads/

2、解压:tar xvf busybox-1.20.0.tar.bz2

3、配置:cd busybox-1.20.0

                 make menuconfig

4、配置选项添加交叉编译工具:arm-linux-

Busybox Settings  --->

         Build Options  --->

添加交叉编译工具前缀:arm-linux-

5、编译:make

6、解决错误:

错误1:

miscutils/ionice.c:23: error: `SYS_ioprio_set' undeclared (first use in this function)

解决方法:将ionice选项去掉

(1)make menuconfig

(2)输入"/",进入到搜索框

(3)在搜索框里面输入:ionice,回车

(4)会列出ionice选项的位置

(5)找到ionice选项并去除选中

(6)保存退出,并且执行:make

错误2:

miscutils/nandwrite.c:64: error: dereferencing pointer to incomplete type

解决方法:将nandwrite,nanddump选项去掉

方法同上

错误3:

miscutils/ubi_tools.c:67:26: mtd/ubi-user.h: No such file or directory

解决方法:将ubi开头的选项都去掉

方法同上

现在编译成功了

7、用新编译出来的busybox替换本来根文件系统的busybox

8、重启开发板,挂载新的根文件系统

9、我们加载驱动:insmod first_drv.ko

卸载驱动的时候出现错误:

rmmod first_drv

rmmod: chdir(/lib/modules): No such file or directory

解决方法:

(1)strace -o log.txt rmmod first_drv

(2)看log.txt文件的结尾:

chdir("/lib/modules")                   = -1 ENOENT (No such file or directory)

提示没有/lib/modules

于是我们创建:mkdir /lib/modules

再次卸载:rmmod first_drv

还有错误:rmmod: chdir(2.6.22.6): No such file or directory

解决方法:

(1)strace -o log.txt rmmod first_drv

(2)看log.txt文件的结尾:

chdir("2.6.22.6")                       = -1 ENOENT (No such file or directory)

于是我们 创建:mkdir /lib/modules/2.6.22.6

卸载成功!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: