strace命令
1.strace简介
strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
2.编译、安装strace
首先需要以下两个文件:
strace-4.5.15.tar.bz2
strace-fix-arm-bad-syscall.patch
//1.解压
#tar -xjf strace-4.5.15.tar.bz2
#cd strace-4.5.15/
//2.打补丁
#patch -p1 <../strace-fix-arm-bad-syscall.patch
//-p1:表示从补丁文件中把第一个斜杠之前的东西去掉
// '<':指定补丁文件的位置
//3.配置
#./configure --host=arm-linux CC=arm-linux-gcc //配置configure
//4.编译
#make //生成strace命令文件
将生成的strace拷贝到开发板上对应的目录就可以了
3.strace的使用
常用参数如下所示:
-o 指定跟踪信息的输出文件
-t 记录跟踪信息的时间,以S为单位
-tt 记录跟踪信息的时间,以uS为单位
3.1 卸载first_drv时出错
insmod first_drv.ko
rmmod first_drv
rmmod: chdir(/lib/modules) : No such file or directory
此时可以利用strace命令来跟踪一下:
strace -o log.txt rmmod first_drv
打开log.txt,你会看到这样的一句话:
chdir(/lib/modules) = -1 ENOENT(No such file or directory)。说明没有/lib/modules目录
此时需要创建 /lib/modules目录
3.2 通过strace来测试led_text应用程序
insmod led.ko
strace -o log.txt ./led_text led1 on
4. strace 原理介绍
stace是一个父进程,它会创建一个子进程,这个子进程会执行rmmod first_drv这个命令。
strace -o log.txt app
在应用程序中调用c库函数,如open 、read、write时。注意这些库函数不是我们自己实现的,是在C库中实现的。
比如在应用程序中调用open时,最终会调用swi那条指令加上某个值,即swi #val1
比如在应用程序中调用read时,最终会调用swi那条指令加上某个值,即swi #val2
比如在应用程序中调用write时,最终会调用swi那条指令加上某个值,即swi #val3
swi指令会导致系统发生一个swi异常,就会进入到内核态,从而就会调用sys_open、sys_read、sys_write等系统函数
在swi异常处理函数vector_swi中先判断一下APP子进程是否被父进程跟踪,如果被跟踪,应用程序会给父进程发一个信号。父进程就将其记录下来,然后让APP继续执行。
注意:Open在内核里面的入口函数时sys_open
本文比较简单的介绍了strace的基本使用方式