当进程由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.
的T在ps输出表示"被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.这个回答既跟踪"的进程正在调试"和"哪个调试正在调试什么".
/ 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调试的.