调试工具Strace

0. Strace是什么?

        按照strace官网的描述, strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。

   源码: https://github.com/strace/strace/releases

1. 编译移植strace

./configure  --prefix=$(pwd)/install  (以x86平台为例)

make

make install

最后在$(pwd)/install目录下生成strace可执行文件

通过 readelf -d strace 可以查看需要的相关库

调试工具Strace_第1张图片

通过反汇编 : 

如果是ARM平台参考如下编译:

调试工具Strace_第2张图片

最后拷贝在开发板上运行:报错如下

原因是开发板的glibc库版本太低了,而strace需要GLIBC_2.15版本的库

strings /lib/i386-linux-gnu/libc.so.6 | grep GLIBC_

调试工具Strace_第3张图片

将虚拟机中/lib/i386-linux-gnu下的libc.so.6 拷贝到开发板对应的目录下。

注意,如果只拷贝这一个文件的话,有可能会无论执行什么指令都导致segmentation fault。本人的开发,连同虚拟机下/lib/i386-linux-gnu/下(下截图所示)拷贝到开发板的/lib/目录下。并且拷贝后,cp 或者mv 后,直接断电,有时会存在假象复制过去了,看目录下的 文件,但是可能文件大小为零,失败了。

通过: sync 命令将内存的同步到磁盘,断电重启才生效。

 

2. strace 调试

2.1一种是启动要跟踪的进程,用法很简单,在原本的命令前加上strace即可,比如我们要跟踪 "ls -lh /var/log/messages" 这个命令的执行,可以这样:

strace ls -lh /var/log/messages

2.2 另一种是运行模式,是跟踪已经运行的的进程,在不中断进程的情况下,理解 它在干嘛,这种情况下,给 strace传递个 -p pid 选项即可。

从一个示例命令来看:

strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p pid

-tt 在每行输出的前面,显示毫秒级别的时间
-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
-f 跟踪目标进程,以及目标进程创建的所有子进程
-e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
-o 把strace的输出单独写到指定的文件
-s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
-p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。

这里特别说下strace的-e trace选项。

要跟踪某个具体的系统调用,-e trace=xxx即可。但有时候我们要跟踪一类系统调用,比如所有和文件名有关的调用、所有和内存分配有关的调用。

如果人工输入每一个具体的系统调用名称,可能容易遗漏。于是strace提供了几类常用的系统调用组合名字。

-e trace=file     跟踪和文件访问相关的调用(参数中有文件名)
-e trace=process  和进程管理相关的调用,比如fork/exec/exit_group
-e trace=network  和网络通信相关的调用,比如socket/sendto/connect
-e trace=signal    信号发送和处理相关,比如kill/sigaction
-e trace=desc  和文件描述符相关,比如write/read/select/epoll等
-e trace=ipc 进程见同学相关,比如shmget等

绝大多数情况,我们使用上面的组合名字就够了。实在需要跟踪具体的系统调用时,可能需要注意C库实现的差异。

你可能感兴趣的:(Linux,工具环境)