如何使用 strace 跟踪子进程?

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

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

108859 次浏览

我想不出一个简单的办法:

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

例如:

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

可以帮助你看到哪个父母创造了什么。也许这会对你有所帮助——至少这样你就可以反向搜索了。

追踪 strace -f的子进程。

有一个名为 strace-graph的 perl 脚本。这是 来自 Github 的版本。它与编译器的 十字凳版本打包在一起。我甚至可以使用跨平台。

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%

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

按照@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用于将输出转储到文件中。