当gdb附加进程时,进程的stat为"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 -显示gdb(27833)
另一个问题:如何知道进程(stat: T)附加了gdb(PID)?,在大多数情况下,我不是调试进程的人。
发布于 2011-07-12 04:48:07
T在ps输出中表示“The ptrace()d”。所以这个过程(26995)正在被某种东西所追踪。最常见的情况是GDB或strace。
因此,如果您知道您只运行GDB而不是strace,如果您看到单个进程处于T状态,那么您就知道您正在调试该进程。
您还可以问GDB它正在调试哪个进程(Es):
(gdb) info process
(gdb) info inferior正如Matthew正确指出的那样,更新,T只是意味着进程停止了,而不是表示它是ptrace()d。
因此,更好的解决办法是这样做:
grep '^TracerPid:' /proc/*/status | grep -v ':.0'
/proc/7657/status:TracerPid: 31069从上面的输出可以看出,进程7657正在被进程31069跟踪。这既回答了“哪个进程是调试器”,也回答了“哪个调试器正在调试什么”。
发布于 2011-07-13 03:33:31
/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主机1-8>cat /proc/2684/status
Name: mytest
State: T (tracing stop)
SleepAVG: 88%
Tgid: 2684
Pid: 2684
PPid: 2683
TracerPid: 4276
.......因此,我们知道2684是由进程4276调试的。
发布于 2011-07-12 07:53:47
您可以从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进行调试。
https://stackoverflow.com/questions/6659308
复制相似问题