如何使用strace跟踪子进程?


104

我曾经strace短暂地附加一个过程。该过程创建了90个线程。当我找到有问题的线程时,我必须繁琐地搜索父线程,然后是祖父母线程,一直到根进程。

是否有技巧或工具可以快速找出哪个线程创建了另一个线程?还是更好,打印类似树的线程创建树pstree


似乎@JeRog答案应该被接受。
jww

Answers:



19

我看不到一个简单的方法:

您可以将-ff选项与-o filename用于产生多个文件(每个pid一个)。

例如:

strace -o process_dump -ff ./executable
grep clone process_dump*

这样可以帮助您了解哪个父母创造了什么。也许对您有帮助-至少您可以向后搜索。


18

有一个Perl脚本称为strace-graph。这是github版本。它与crosstool-ng版本的编译器打包在一起。即使使用跨平台,它也对我有效。

ARM Linux盒子。

$ ./strace -f -q -s 100 -o app.trc -p 449
$ tftp -pr app.trc 172.0.0.133

X86_64 Linux盒子。

$ ./strace-graph /srv/tftp/app.trc 
 (anon)
  +-- touch /tmp/ppp.sleep
  +-- killall -HUP pppd
  +-- amixer set Speaker 70%
  +-- amixer set Speaker 70%
  +-- amixer set Speaker 70%
  +-- amixer set Speaker 70%
  +-- amixer set Speaker 50%
  +-- amixer set Speaker 70%
  `-- amixer set Speaker 50%

该输出可用于帮助导航主跟踪日志。


1
非常好,至少几天以来,这几乎就是我想要的东西。令人惊讶的是,我什至可以在我的/ usr / share / doc / strace / examples /中看到它。
mykhal 2013年

0

要捕获单个进程的流量,可以使用strace@stackmate建议。

strace -f -e trace=network -s 10000 -p <PID>;

或将其输出到文件中。

strace -f -e trace=network -s 10000 -o dumpfile -p <PID>

-f对于所有分叉的过程,-s要打印的字符串大小以及-o将输出转储到文件中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.