当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
从上面可以看出,26995可能正在进行调整。我怎么知道26995是否调试?或者我可以知道gdb附加了哪个进程(27833)
pstree -p 27833 --- show gdb(27833)
另一个问题:如何知道一个进程(stat:T)附加了哪个gdb(PID)? 在大多数情况下,我不是正在贬低这个过程的peoson。
答案 0 :(得分:8)
T
输出中的ps
代表“是ptrace()d”。因此,某事正在跟踪该过程(26995)。这通常是GDB
或strace
。
是的,如果您知道自己只运行GDB
而不是strace
,并且如果您看到T
状态的单个进程,那么您知道您正在调试过程
你也可以问GDB
它正在调试哪个进程:
(gdb) info process
(gdb) info inferior
<强>更新强>
正如Matthew Slattery正确指出的那样,T
只是意味着流程已停止,而不是ptrace()d
。
因此,更好的解决方案是:
grep '^TracerPid:' /proc/*/status | grep -v ':.0'
/proc/7657/status:TracerPid: 31069
从上面的输出可以看出进程31069正在跟踪进程7657.这回答“哪个进程正在调试器”和“哪个调试器正在调试什么”。
答案 1 :(得分:5)
/ proc文件系统是Linux的远程设计。许多过程实时信息可以从 / proc / {PID} / 中找到。
另一个问题:如何知道一个过程(stat:T) GDB(PID)?在大多数的siduation中,我不是正在贬低它的peoson 过程
对于这个问题,我们可以检查/ proc / {PID} /状态文件以获得答案。
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
host1-8&gt; cat / proc / 2684 / status
Name: mytest
State: T (tracing stop)
SleepAVG: 88%
Tgid: 2684
Pid: 2684
PPid: 2683
TracerPid: 4276
.......
因此我们知道2684是由进程4276调试的。
答案 2 :(得分:0)
您可以从ps axf
输出中找到此信息。
1357 ? Ss 0:00 /usr/sbin/sshd
1935 ? Ss 0:00 \_ sshd: root@pts/0
1994 pts/0 Ss 0:00 \_ -bash
2237 pts/0 T 0:00 \_ gdb /bin/ls
2242 pts/0 T 0:00 | \_ /bin/ls
2243 pts/0 R+ 0:00 \_ ps axf
这里,进程2242正由gdb进程2237进行调试。