strace是一个在类Unix操作系统如Linux上做debugging和trouble shooting的超级好用的工具。它可以捕获和记录进程的所有系统调用,以及这个进程接收的所有信号。
原文: 10 Strace Commands for Troubleshooting and Debugging Linux Processes
如果你的操作系统还没有安装strace,你可以运行下面的命令进行安装:
|
|
如果一个程序崩溃或以一种出乎意料的方式运行,您可以通过它的系统调用来获得在执行过程中到底发生了什么的线索。我们将在后面看到,系统调用可以分为不同的事件:与进程管理相关的事件、以文件为参数的事件、涉及网络、内存映射、信号、IPC以及与文件描述符相关的系统调用。
可以使用strace运行程序/命令,也可以使用-p
选项将PID传递给它,如下面示例所示。
追踪Linux系统调用
你可以通过运行下面的命令,追踪df
命令的系统调用。
|
|
从上面的输出结果,我们可以看到几种类型的系统调用,比如
|
|
其中
- open: 系统调用的类型
- (“/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) : 系统调用的参数
- 3: 系统调用的返回结果
下面是df命令执行的时候write系统调用信息:
|
|
根据进程PID进行追踪
如果一个进程已经在运行,你可以通过它的pid进行追踪,它会显示追踪后这个进程的系统调用,使用CTRL+C
退出。
|
|
得到进程的汇总信息
使用-c
参数,可以得到追踪的每一种系统调用的耗时、次数和失败数,如下所示:
|
|
打印指令指针
-i
可以显示每一次系统调用的时候的指令指针。
|
|
显示每一次调用的时间
-t
参数可以显示时间戳。
|
|
显示系统调用的耗时
-T
参数可以显示系统调用的耗时时间。
|
|
只追踪特定的系统调用
下面的命令中,trace=write
是使用一个特定的表达式做筛选,只追踪特定的系统调用。表达式可以是signal, abbrev, verbose, raw, read 和 write等几种类型。
|
|
又比如
|
|
基于特定条件的系统调用
可以针对特定类型进行追踪(process、file、memory、network、signal)等等。
针对进行管理的追踪:
|
|
针对文件系统调用的追踪:
|
|
针对内存的追踪:
|
|
以及针对网络和信号的追踪:
|
|
将追踪结果写入到文件
-o
参数将标准输出写入到文件:
|
|
显示strace的debug信息
-d
可以显示strace的debug信息。
更多的信息参考man strace
。
其它一些参考资料: