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

GDB除錯正在執行的程式

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

一、多執行緒除錯

多執行緒除錯可能是問得最多的。其實,重要就是下面幾個命令:

  • info thread 檢視當前程序的執行緒。

  • thread <ID> 切換除錯的執行緒為指定ID的執行緒。

  • break file.c:100 thread all  在file.c檔案第100行處為所有經過這裡的執行緒設定斷點。

  • set scheduler-locking off|on|step,這個是問得最多的。在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,怎麼只讓被除錯程式執行呢?通過這個命令就可以實現這個需求。

    • off 不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值。

    • on 只有當前被除錯程式會執行。

    • step 在單步的時候,除了next過一個函式的情況(熟悉情況的人可能知道,這其實是一個設定斷點然後continue的行為)以外,只有當前執行緒會執行。

二、除錯巨集

這個問題超多。在GDB下,我們無法print巨集定義,因為巨集是預編譯的。但是我們還是有辦法來除錯巨集,這個需要GCC的配合。

在GCC編譯程式的時候,加上-ggdb3引數,這樣,你就可以除錯巨集了。

另外,你可以使用下述的GDB的巨集除錯命令 來檢視相關的巨集。

  • info macro – 你可以檢視這個巨集在哪些檔案裡被引用了,以及巨集定義是什麼樣的。

  • macro – 你可以檢視巨集展開的樣子。

1、首先獲得程式的PID

ps -ef | grep xxxxx 

 2、進入除錯程式

  1. gdb attach PID  

3、gcore命令生成CORE檔案

4、程序資訊可以用info  proc顯示

5、 暫存器資訊可以用info reg顯示