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的基本使用方式

原文地址:https://www.cnblogs.com/-glb/p/12592612.html