Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Process 如何知道gdb附加了哪个进程(stat:T)?_Process_Gdb - Fatal编程技术网

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

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 所以是的,如果

当一个进程被gdb连接时,该进程的状态为“T”,如:

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

pstree-P27833---显示gdb(27833)

另一个问题:如何知道流程(stat:T)与哪个gdb(PID)相连?
在大多数情况下,我并不是调试流程的人。

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
.......