有時會遇到一種很特殊的調(diào)試需求,對當(dāng)前正在運行的其它進程進行調(diào)試(正是我今天遇到的情形)。這種情況有可能發(fā)生在那些無法直接在調(diào)試器中運行的進程身上,例如有的進程 只能在系統(tǒng)啟動時運行。另外如果需要對進程產(chǎn)生的子進程進行調(diào)試的話,也只能采用這種方式。GDB可以對正在執(zhí)行的程序進行調(diào)度,它允許開發(fā)人員中斷程序 并查看其狀態(tài),之后還能讓這個程序正常地繼續(xù)執(zhí)行。
GDB提供了兩種方式來調(diào)試正在運行的進程:一種是在GDB命令行上指定進程的PID,另一種是在GDB中使用“attach”命令。例如,開發(fā)人員可以先啟動debugme程序,讓其開始等待用戶的輸入。示例如下:
#./debugme Enter a string to count words: |
接下去在另一個虛擬控制臺中用下面的命令查出該進程對應(yīng)的進程號:
# ps -ax | grep debugme 555 pts/1 S 0:00 ./debugme |
得到進程的PID后,就可以使用GDB對其進行調(diào)試了:
# gdb debugme 555 GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) Attaching to program: /home/xiaowp/debugme, process 555 Reading symbols from /lib/libc.so.6...done. …… |
在上面的輸出信息中,以Attaching to program開始的行表明GDB已經(jīng)成功地附加在PID為555的進程上了。另外一種連接到其它進程的方法是先用file命令加載調(diào)試時所需的符號表,然后再通過“attaché”命令進行連接:
(gdb) file /home/xiaowp/debugme Reading symbols from /home/xiaowp/debugme...done. (gdb) attach 555 …… |
如果想知道程序現(xiàn)在運行到了哪里,同樣可以使用“backtrace”命令。當(dāng)然也可以使用“step”命令對程序進行單步調(diào)試。
在完成調(diào)試之后,不要忘記用detach命令斷開連接,讓被調(diào)試的進程可以繼續(xù)正常運行。