Process 如何知道gdb附加了哪个进程(stat:T)?
当一个进程被gdb连接时,该进程的状态为“T”,如: 从上面可以看出,26995可能正在调试。我怎么知道26995是否调试?或者我可以知道gdb(27833)附加了哪个进程吗 pstree-P27833---显示gdb(27833) 另一个问题:如何知道流程(stat:T)与哪个gdb(PID)相连?Process 如何知道gdb附加了哪个进程(stat:T)?,process,gdb,Process,Gdb,当一个进程被gdb连接时,该进程的状态为“T”,如: 从上面可以看出,26995可能正在调试。我怎么知道26995是否调试?或者我可以知道gdb(27833)附加了哪个进程吗 pstree-P27833---显示gdb(27833) 另一个问题:如何知道流程(stat:T)与哪个gdb(PID)相连? 在大多数情况下,我并不是调试流程的人。ps输出中的T代表“being ptrace()d”。所以这个过程(26995)被某种东西所追踪。某些东西通常要么是GDB,要么是strace 所以是的,如果
在大多数情况下,我并不是调试流程的人。ps输出中的
T
代表“being 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。这将回答“哪个进程正在调试”和“哪个调试程序正在调试什么”。您可以从
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调试。/proc文件系统是Linux的远程设计。许多进程实时信息可以在/proc/{PID}/中找到 另一个问题:如何知道一个进程(stat:T)是由哪个进程附加的 gdb(PID)?在大多数情况下,我不是调试程序的人 过程 对于这个问题,我们可以检查/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
host1-8>cat/proc/2684/status
Name: mytest
State: T (tracing stop)
SleepAVG: 88%
Tgid: 2684
Pid: 2684
PPid: 2683
TracerPid: 4276
.......
因此,我们知道2684是由进程4276调试的。
T
只是表示“停止”,不一定是“ptrace()d”。例如,尝试sleep 10000
,按Ctrl-Z,然后ps-ux | grep-sleep
。在GDB 7.8中,info-process
不再存在。info proc
或info program
都显示PID。
Name: mytest
State: T (tracing stop)
SleepAVG: 88%
Tgid: 2684
Pid: 2684
PPid: 2683
TracerPid: 4276
.......