如何知道gdb附加了哪个进程(stat:T)?

zhe*_*ing 5 gdb process

当进程由gdb附加时,进程的统计信息为"T",如:

root      6507  0.0  0.0  67896   952 ?        Ss   12:01   0:00 /mytest
root      6508  0.0  0.0 156472  7120 ?        Sl   12:01   0:00 /mytest
root     26994  0.0  0.0  67896   956 ?        Ss   19:59   0:00 /mytest
root     26995  0.0  0.0 156460  7116 ?        Tl   19:59   0:00 /mytest
root     27833  0.0  0.0  97972 24564 pts/2    S+   20:00   0:00 gdb /mytest
Run Code Online (Sandbox Code Playgroud)

从上面可以看出,26995可能正在调整.我怎么知道26995是否调试?或者我可以知道gdb附加了哪个进程(27833)

pstree -p 27833 --- show gdb(27833)

另一个问题:如何知道一个进程(stat:T)附加哪个gdb(PID)? 在大多数siduation中,我不是正在调整过程的peoson.

Emp*_*ian 8

Tps输出表示"被ptrace的()d".所以这个过程(26995)正在被某种东西追踪.最常见的事情是GDB,或者strace.

所以,是的,如果你知道你只是在运行GDB而不是strace,并且如果你看到一个T状态的进程,那么你知道你正在调试该进程.

您还可以询问GDB它正在调试哪个进程:

(gdb) info process
(gdb) info inferior
Run Code Online (Sandbox Code Playgroud)

更新 正如Matthew Slattery正确指出的那样,T只是意味着流程已停止,而不是它正在发生ptrace()d.

所以更好的解决方案是这样做:

 grep '^TracerPid:' /proc/*/status | grep -v ':.0'
 /proc/7657/status:TracerPid:    31069
Run Code Online (Sandbox Code Playgroud)

从上面的输出,你可以告诉大家,过程7657是由工艺31069.这个回答既跟踪"的进程正在调试"和"哪个调试正在调试什么".


zhe*_*ing 5

/ proc文件系统是Linux的远程设计.可以从/ proc/{PID} /中找到许多过程实时信息.

另一个问题:如何知道一个进程(stat:T)附加哪个gdb(PID)?在大多数siduation中,我不是正在调整过程的peoson.

对于这个问题,我们可以检查/ proc/{PID}/status文件来获得答案.

root     14616  0.0  0.0 36152  908 ?        Ss   Jun28   0:00 /mytest
root     14617  0.5  0.0 106192 7648 ?       Sl   Jun28 112:45 /mytest
tachyon   2683  0.0  0.0 36132 1008 ?        Ss   11:22   0:00 /mytest
tachyon   4276  0.0  0.0 76152 20728 pts/42  S+   11:22   0:00 gdb /mytest
tachyon   2684  0.0  0.0 106136 7140 ?       Tl   11:22   0:00 /mytest
Run Code Online (Sandbox Code Playgroud)

host1-8> cat/proc/2684/status

Name:   mytest
State:  T (tracing stop)
SleepAVG:       88%
Tgid:   2684
Pid:    2684
PPid:   2683
TracerPid:      4276
.......
Run Code Online (Sandbox Code Playgroud)

因此,我们知道2684是由过程4276调试的.