(すべてのスレッドの)マルチスレッドプロセスをトレースする場合、どうすればよいですか?
フォークされたプロセスを追跡するためにstrace -fを実行できることを知っていますか?しかし、トレースを開始するときにすでにマルチスレッド化されているプロセスにアタッチするのはどうですか?このプロセスに属するすべてのスレッドのすべてのシステムコールをトレースするようにstraceに指示する方法はありますか?
トレースする各tidをリストすることにより、私はこれを巧妙な方法で実行しました。
それらはps
で見つけることができます:
$ ps auxw -T | fgrep program_to_trace
me pid tid1 ...
me pid tid2 ...
me pid tid3 ...
me pid tid4 ...
その後、man strace
に従って、一度に複数のPIDにアタッチできます。
-p pid Attach to the process with the process ID pid and begin tracing. The trace may be terminated at any time by a keyboard interrupt
signal (CTRL-C). strace will respond by detaching itself from the traced process(es) leaving it (them) to continue running. Mul‐
tiple -p options can be used to attach to up to 32 processes in addition to command (which is optional if at least one -p option is
given).
pid
と書かれていますが、Linuxではiircはpidとtidが同じ名前空間を共有しており、これは動作するように見えます:
$ strace -f -p tid1 -p tid2 -p tid3 -p tid4
今のところあなたができる最善のことだと思います。しかし、誰かがstrace
をtidを展開するためのフラグで拡張できると思います。おそらく、プロセスを見つけてそれらにアタッチすることの間には、おそらく新たに開始されたプロセスが見落とされるような競合が存在するでしょう。 strace -f
に関する既存の警告に適合します。
-f Trace child processes as they are created by currently traced processes as a result of the fork(2) system call.
On non-Linux platforms the new process is attached to as soon as its pid is known (through the return value of fork(2) in the par‐
ent process). This means that such children may run uncontrolled for a while (especially in the case of a vfork(2)), until the par‐
ent is scheduled again to complete its (v)fork(2) call. On Linux the child is traced from its first instruction with no delay. If
the parent process decides to wait(2) for a child that is currently being traced, it is suspended until an appropriate child
process either terminates or incurs a signal that would cause it to terminate (as determined from the child's current signal dispo‐
sition).
On SunOS 4.x the tracing of vforks is accomplished with some dynamic linking trickery.
複数のコメントで回答したように、strace -fp <pid>
は、そのプロセスが所有するすべてのスレッドのトレースを表示します-strace
が始まる前にプロセスが既に生成したスレッドも含めます。