1. 程式人生 > >gdb除錯正在執行的程序

gdb除錯正在執行的程序

   有時會遇到一種很特殊的除錯需求,對當前正在執行的其它程序進行除錯(正是我今天遇到的情形)。這種情況有可能發生在那些無法直接在偵錯程式中執行的程序身上,例如有的程序 只能在系統啟動時執行。另外如果需要對程序產生的子程序進行除錯的話,也只能採用這種方式。GDB可以對正在執行的程式進行排程,它允許開發人員中斷程式 並檢視其狀態,之後還能讓這個程式正常地繼續執行。

     GDB提供了兩種方式來除錯正在執行的程序:一種是在GDB命令列上指定程序的PID,另一種是在GDB中使用“attach”命令。例如,開發人員可以先啟動debugme程式,讓其開始等待使用者的輸入。示例如下:

#./debugme
            Enter a string to count words:



     接下去在另一個虛擬控制檯中用下面的命令查出該程序對應的程序號:

# ps -ax | grep debugme
            555 pts/1 S 0:00 ./debugme



     得到程序的PID後,就可以使用GDB對其進行除錯了:

# 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已經成功地附加在PID為555的程序上了。另外一種連線到其它程序的方法是先用file命令載入除錯時所需的符號表,然後再通過“attaché”命令進行連線:

(gdb) file /home/xiaowp/debugme
            Reading symbols from /home/xiaowp/debugme...done.
            (gdb) attach 555
            ……



     如果想知道程式現在執行到了哪裡,同樣可以使用“backtrace”命令。當然也可以使用“step”命令對程式進行單步除錯。

     在完成除錯之後,不要忘記用detach命令斷開連線,讓被除錯的程序可以繼續正常執行。