2011-07-12 54 views
5

當一個過程是由GDB附接時,過程的統計是「T」,如:如何知道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 --- SHOW GDB(27833)

另一個問題:如何知道一個進程(STAT:T)是由附哪個gdb(PID)? 在大多數情況下,我不是調試過程的人。

回答

7

T in ps輸出表示「是ptrace()d」。所以這個過程(26995)正在追查東西。最常見的是GDBstrace。因此,如果您知道您只運行GDB而不是strace,並且如果您看到單個進程處於T狀態,那麼您知道您正在調試該進程。

你也可以問GDB哪個進程(ES)是調試:

(gdb) info process 
(gdb) info inferior 

更新 馬修斯萊特里正確地指出,T只是意味着該過程停止,而不是它正在ptrace()d

因此,一個更好的解決辦法是要做到這一點:

grep '^TracerPid:' /proc/*/status | grep -v ':.0' 
/proc/7657/status:TracerPid: 31069 

從上面的輸出,你可以告訴大家,過程7657是由工藝31069.這都回答「哪些進程正在調試」和「哪個調試追蹤正在調試什麼「。

+1

'T'只是意味着 「停止」,不一定「作爲ptrace()d「。例如,嘗試'sleep 10000',按Ctrl-Z,然後選擇'ps ux | grep睡眠'。 –

+0

謝謝,你很正確。答案已更新。 –

+0

在GDB 7.8中,'info process'不再存在。 'info proc'或'info program'都顯示PID。 –

0

您可以從ps axf輸出中找到此信息。

1357 ?  Ss  0:00 /usr/sbin/sshd 
1935 ?  Ss  0:00 \_ sshd: [email protected]/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過程debuged 2237

5

/proc文件系統是Linux的一個TELENT設計。許多過程實時信息可以從/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 /狀態

Name: mytest 
State: T (tracing stop) 
SleepAVG:  88% 
Tgid: 2684 
Pid: 2684 
PPid: 2683 
TracerPid:  4276 
....... 

因此,我們知道2684是由工藝調試4276.

相關問題