如何使用strace跟踪子进程?

时间:2010-10-29 15:09:24

标签: linux multithreading strace

我使用strace简要地附加到流程。该过程创建了90个线程。当我找到有问题的线程时,我不得不繁琐地搜索父线程,然后是祖父母线程,等等一直到根进程。

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

4 个答案:

答案 0 :(得分:93)

strace -f用于跟踪fork() ed。

的子进程

答案 1 :(得分:17)

有一个名为strace-graph的perl脚本。这是一个version from 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 box。

$ ./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%

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

答案 2 :(得分:16)

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

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

例如:

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

可以帮助您查看哪个父级创建了什么。也许那会对你有帮助 - 至少你可以向后搜索。

答案 3 :(得分:0)

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

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

或将其输出到文件中。

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

-f用于所有分支过程,-s用于打印字符串大小,而-o用于将输出转储到文件中。