我曾经strace
简单地附加到一个进程。该进程创建了 90 个线程。当我找到有问题的线程时,我不得不繁琐地搜索父线程,然后是祖父线程,依此类推,一直到根进程。
是否有技巧或工具可以快速找出哪个线程创建了另一个线程?或者更好的是,打印线程创建树,例如pstree
?
我曾经strace
简单地附加到一个进程。该进程创建了 90 个线程。当我找到有问题的线程时,我不得不繁琐地搜索父线程,然后是祖父线程,依此类推,一直到根进程。
是否有技巧或工具可以快速找出哪个线程创建了另一个线程?或者更好的是,打印线程创建树,例如pstree
?
strace -f
跟踪已fork()
编辑的子进程。
我看不到一个简单的方法:
您可以使用-ff
with 选项-o filename
生成多个文件(每个 pid 一个)。
例如:
strace -o process_dump -ff ./executable
grep clone process_dump*
这将帮助您查看哪个父级创建了什么。也许这会对您有所帮助-至少您可以向后搜索。
有一个名为 .perl 的脚本strace-graph
。这是来自 github 的一个版本。它与crosstool-ng版本的编译器一起打包。它适用于我甚至使用跨平台。
$ ./strace -f -q -s 100 -o app.trc -p 449
$ tftp -pr app.trc 172.0.0.133
$ ./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%
输出可用于帮助导航主跟踪日志。
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
输出转储到文件中。