要附加到多线程进程的Stracing

如果我想扫射一个多线程进程(它的所有线程),我应该怎么做

我知道一个人可以用strace-f来遵循分叉过程?但是,当我开始扫描时,附加到一个已经是多线程的进程怎么样?是一种让strace跟踪属于此进程的所有线程的所有系统调用的方法吗

2021年更新

strace-fp-PID在我的系统上做了正确的事情(Ubuntu 20.04.1 LTS)。strace手册页面指出:

-f跟踪子进程,因为它们是由当前跟踪的进程作为fork(2)、vfork(2)和clone(2)系统的结果创建的
电话。请注意,-p PID-f将连接进程PID的所有线程(如果它是多线程的),而不仅仅是线程id=PID的线程。

看起来这段文字是2013年添加的。如果当时-f在我的系统上有这种行为,我没有意识到。不过现在是这样了

2013年原始答复

我只是以一种笨拙的方式做了这件事,列出了要跟踪的每个tid

您可以通过ps找到它们:

$ps auxw-T | fgrep程序到跟踪
给我一个pid tid1。。。
我是第二个。。。
给我第三次。。。
给我第四次。。。

然后,根据man strace,您可以一次连接到多个PID:

-p将pid附加到进程ID为pid的进程并开始跟踪。可通过键盘中断随时终止跟踪
信号(CTRL-C)。strace将通过将自身从跟踪进程中分离出来,让其继续运行来进行响应。多
tiple-p选项可用于附加到命令之外的多达32个进程(如果至少有一个-p选项可用,则该选项是可选的)
给定)。

它说的是pid,但Linux上的iirc pid和tid共享同一名称空间,这似乎是可行的:

$strace-f-pTID1-pTID2-pTID3-pTID4

我想这可能是你目前能做的最好的了。但是我想有人可以用扩展TID的标志来扩展strace。在寻找流程和附加流程之间可能仍然存在一场竞赛,在这场竞赛中,新启动的流程将被错过。它符合关于strace-f的现有警告:

-f跟踪子进程,因为它们是由当前跟踪的进程作为fork(2)系统调用的结果创建的。
在非Linux平台上,一旦它的PID已知(通过叉(2)在PAR中的返回值,就附加新进程。
(耳鼻喉科手术)。这意味着这样的孩子可能一段时间内失控(特别是在VoCK(2)的情况下),直到PAR。
ent再次计划完成其(v)fork(2)调用。在Linux上,从第一条指令开始跟踪子指令,没有延迟。如果
父进程决定等待(2)当前正在跟踪的子进程,它将挂起,直到找到合适的子进程
进程终止或产生导致其终止的信号(根据子进程的当前信号显示确定
(修订)。
在Sunos4.x上,vWorks的跟踪是通过一些动态链接技巧完成的。

发表评论