121

我曾经strace简单地附加到一个进程。该进程创建了 90 个线程。当我找到有问题的线程时,我不得不繁琐地搜索父线程,然后是祖父线程,依此类推,一直到根进程。

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

4

4 回答 4

147

strace -f跟踪已fork()编辑的子进程。

于 2011-06-11T07:36:58.737 回答
27

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

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

例如:

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

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

于 2011-04-29T20:05:19.193 回答
23

有一个名为 .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%

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

于 2013-05-15T18:33:23.067 回答
1

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输出转储到文件中。

于 2019-11-21T23:03:50.220 回答