如果我想要跨所有线程的multithreading进程,我该怎么做?
我知道一个人可以做strace -f跟随分叉的过程吗? 但是当我开始进行stracing时,如何连接到已经是multithreading的进程呢? 是否可以告诉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上的iidc pid和tid共享相同的命名空间,这似乎工作:
$ strace -f -p tid1 -p tid2 -p tid3 -p tid4
我想这可能是你现在可以做的最好的。 但是我猜想有人可以用伸张的旗子扩大势力范围。 可能仍然会有一个找到过程,并附加到他们,其中一个刚刚开始的错过了比赛。 它适合现有的关于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.