一、安装:
1、解压:tar xvf strace-4.5.15.tar.bz2
2、打补丁:cd strace-4.5.15
patch -p1 < ../strace-fix-arm-bad-syscall.patch
---是原来的文件,+++是修改后的文件,+是添加的代码,要加参数把第1个斜杠前的
内容去掉,才能找到要给哪一个文件打补丁。-p1这里的数字1是从补丁文件里面吧第1
个斜杠前的内容去掉,就可以打哪一个文件。
3、配置:./configure --host=arm-linux CC=arm-linux-gcc
//--host=arm-linux表示程序编译出来后在arm上的linux系统上运行
//CC表示编译器
4、编译:make
5、拷贝:将strace文件拷贝到开发板根文件系统的bin目录下
二、实验
(1)安程序,直接输入strace+回车查看使用
(2)用strace跟踪调用(可以知道应用程序运行过程中调用了哪一些系统调用函数)
把生成的log.text拷贝到PC端分析,这里fd=3,把数值\1\0\0\0写到文件3里面去,写4字节。
这里val值为1,涉及open和write调用
三、原理说明
strace主要用于跟踪系统调用,那么是如何跟踪的呢?我们来分析一下:
首先strace会作为一个父进程,而被跟踪的系统调用作为子进程,我们用open函数来
举个例子:
我们知道在用户空间的open函数,它会调用一个swi指令加上一个值,这个指令会导致
一个异常,然后进入内核态,在这个异常处理函数里面就会根据那个值找到并调用
sys_open这个函数,下面我们就来好好的来看一个这个异常处理函数:
首先在内核里搜索:vector_swi,找到:
ENTRY(vector_swi)
@测试本系统调用是被跟踪,如果被跟踪的话就调用:__sys_trace
tstip, #_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 --->
Cross Compiler prefix(NEW) --->
添加交叉编译工具前缀: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
先备份旧的busybox
把新编译的busybox拷贝过来
8、重启开发板,挂载新的根文件系统
查看busybox版本,替换成功
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
卸载成功!