使用Linux scrace命令跟踪/调试程序

时间:2020-03-05 15:28:40  来源:igfitidea点击:

STRACE是通过追踪程序执行的系统调用有助于调试问题的工具。
当我们希望了解程序如何与操作系统交互时,它是方便的,如系统调用以什么顺序执行。

这种简单但非常强大的工具对于几乎所有基于Linux的操作系统都可使用,可用于调试大量程序。

1.命令用法

让我们看看我们如何使用strace命令来跟踪程序的执行。

在最简单的形式中,任何命令都可以遵循strace。
它将列出大量的系统调用。
并非所有这一切都会成为Sence起初,但如果你真的在寻找一些特别的东西,那么你应该能够解决这个输出的东西。
让我们看到Simple LS命令的系统调用跟踪。

igi@igi-theitroad ~ $strace ls

此输出显示strace命令的前几行。
输出的其余部分被截断。

上述输出显示写系统调用,其中输出到STDOUT当前目录列表。
以下图像显示LS命令(不包含符号)的Directoy列表。

igi@igi-theitroad ~ $ls

1.1查找程序读取的配置文件

一个使用scrace(除调试某些问题除外)是我们可以了解程序读取哪些配置文件。
例如,

igi@igi-theitroad ~ $strace php 2>&1 | grep php.ini

1.2跟踪特定系统调用

strace命令的-e选项可用于仅显示某些系统调用(例如,打开,写入等)

允许仅追踪CAT命令的"打开"系统调用。

igi@igi-theitroad ~ $strace -e open cat dead.letter

1.3调试进程

scrace命令不仅可以在命令上使用,还可以在-p选项上运行进程。

igi@igi-theitroad ~ $sudo strace -p 1846

1.4统计摘要

系统调用摘要,执行时间,错误等,可以使用-c选项以neat方式显示:

igi@igi-theitroad ~ $strace -c ls

1.5保存输出

scrace命令的输出可以保存到带有-o选项的文件中。

igi@igi-theitroad ~ $sudo strace -o process_strace -p 3229

上面的命令用sudo运行,因为如果用户ID与进程所有者不匹配,它将显示错误。

1.6显示时间戳

可以在每个输出行与-t选项之前显示时间戳。

igi@igi-theitroad ~ $strace -t ls

1.7更精细的时间戳

-tt选项显示时间戳,然后显示microSecond。

igi@igi-theitroad ~ $strace -tt ls

-ttt显示如上微秒,而不是打印豁免时间,它显示自时代以来的秒数。

igi@igi-theitroad ~ $strace -ttt ls

1.8相对时间

-r选项显示系统调用之间的相对时间戳。

igi@igi-theitroad ~ $strace -r ls