strace是个工具,在使用时需要先按照,见韦东山书籍:
1、tar xjf starce-4.5.15.tar.bz2
2、cd strace-4.5.15/
3、patch -p1 < ../strace-fix-arm-bad-syscall.patch
4、./configure --host=arm-linux CC=arm-linux-gcc
5、make
会在strace-4.5.15目录下生成一个名为strace的可执行程序,将它复制到开发板根文件系统的bin中即可使用
简单使用举例:
1、执行strace -o log.txt ./firstdrv on
2、参看log.txt可以参看应用程序执行过程中调用了哪些系统调用和调用库的过程
strace使用可以跟踪开发板上执行的所有指令,只需要在指令前面加上strace -o log.txt
strace用法的原理:strace是父进程,执行的指令是子进程,应用程序执行时的read等系统调用就是产生一个swi #val异常指令,进入内核异常处理函数ENTRY(vector_swi)中,内核根据val调用相应的sys_read函数
adr tbl, sys_call_table //sys_call_table 包含有各个系统调用,是通过在ENTRY(sys_call_table)
#include "calls.S"的方式来定义系统跳转标的
‘’‘’
ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine //根据scno执行响应的系统调用
内核中ENTRY(vector_swi)在执行的时候,其里面有个判断语句“tst ip,#_TIF_SYSCALL_TRACE”应该是根据某个标志位测试应用程序是否被父进程跟踪,如果被跟踪,调用__sys_trace,接着调用syscall_trace ,会给父进程发信号,并且休眠,等待父进程相应后(比如记录系统调用)子进程才继续执行