1. 程式人生 > >linux gdb 除錯多執行緒 多程序 顯示巨集

linux gdb 除錯多執行緒 多程序 顯示巨集

               

一、gdb除錯多執行緒

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

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

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

gdb)set scheduler-locking off|on|step。在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,怎麼只讓被除錯程式執行呢?通過這個命令就可以實現這個需求。 off 不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值。 on 只有當前被除錯程式會執行。 step 在單步的時候,除了next過一個函式的情況(熟悉情況的人可能知道,這其實是一個設定斷點然後continue的行為)以外,只有當前執行緒會執行。

gdb)thread apply ID1 ID2 command 讓執行緒id號為ID1,ID2執行GDB的  continue,break,step,next等命令。

gdb)thread apply all command 讓所有被除錯執行緒執行GDB的 continue,break,step,next等命令。

二、gdb除錯多程序

1、follow-fork-mode方法

這是一種比較簡單的方式,通過set follow-fork-mode的方式來除錯父程序或子程序

2、attach的方式,這種應該是比較常用的方式,也是很多文章中介紹的一種方式。這種方式一般需要增加一些程式碼來實現對程序的attach

下面只介紹follow-fork-mode方法

       在程式fork之前輸入

 gdb)set follow-fork-mode [parent|child]

follow-fork-mode的用法為:

set follow-fork-mode [parent|child]

  • parent: fork之後繼續除錯父程序,子程序不受影響。
  • child: fork之後除錯子程序,父程序不受影響。

因此如果需要除錯子程序,在啟動gdb後:

(gdb) set follow-fork-mode child

並在子程序程式碼設定斷點。

detach-on-fork引數,指示GDB在fork之後是否斷開(detach)某個程序的除錯,或者都交由GDB控制:

set detach-on-fork [on|off]

  • on: 斷開除錯follow-fork-mode指定的程序。
  • off: gdb將控制父程序和子程序。follow-fork-mode指定的程序將被除錯,另一個程序置於暫停(suspended)狀態
三、gdb除錯巨集

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

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

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

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

四、條件斷點

條件斷點

條件斷點是語法是:break  [where] if [condition],這種斷點真是非常管用。尤其是在一個迴圈或遞迴中,或是要監視某個變數。注意,這個設定是在GDB中的,只不過每經過那個斷點時GDB會幫你檢查一下條件是否滿足。