GDB除錯多執行緒 多程序

2021-08-17 20:19:45 字數 2029 閱讀 2319

用gdb除錯多程序程式

如果乙個程序通過fork系統呼叫建立了子程序,gdb會繼續除錯原來的程序,子程序則正常執行。那麼該如何除錯子程序呢?

單獨除錯子程序:

子程序從本質上說也是乙個程序,因此我們可以用通用的gdb除錯方法來除錯他。

舉例來說如果要除錯乙個伺服器中的某乙個子程序,我們可以先執行伺服器,然後找到目標子程序的pid,再將其附加(attach)到gdb偵錯程式上,具體操作為:

$ps -ef | grep

程序名              //通過該命令得到待除錯程序的pid

$(gdb) attach "pid"                //上面的「pid」即待除錯程序的pid

使用偵錯程式選項follow-fork-mode

gdb偵錯程式的選項follow-fork-mode允許我們選擇程式在執行fork系統呼叫後是繼續除錯父程序還是除錯子程序。

其用法如下:

$(gdb)set follow-fork-mode mode

上面的mode可選parent或child,分別表示除錯父程序和子程序。

舉例:

$(gdb) set follow-fork-mode child

$(gdb) b process.h:264                  //在process.h 的264行下斷點

用gdb除錯多執行緒程式

gdb有一組命令可輔助多執行緒程式的除錯。

infothreads

顯示當前可除錯的所有執行緒。gdb會為每個執行緒分配乙個id,我們可以使用這個id來操作對應的執行緒。id前面有「*」的執行緒是當前被除錯的執行緒。

threadid

除錯目標id指定的執行緒。

set scheduler-locking[off|on|step]

除錯多執行緒程式時,預設除了被除錯的執行緒在執行外,其他執行緒也在繼續執行,但有的時候我們希望只讓被除錯的執行緒執行。這可以通過這個命令來實現。

該命令設定scheduler-locking的值:

off表示不鎖定任何執行緒,即所有執行緒都可以繼續執行,這是預設值。

on表示只有當前被除錯的執行緒會繼續執行。

step表示在單步執行的時候,只有當前執行緒會執行。

以下是使用示例

$

(gdb) info threads                              //檢視執行緒資訊,當前被除錯的是那個執行緒

$(gdb) set scheduler-locking on              //不執行其他執行緒,鎖定除錯物件

$(gdb)thread 2                                           //將除錯切換到子執行緒,其id為2

關於除錯程序池或執行緒池程式的乙個不錯的方法:

先將池中的程序個數或執行緒個數減少至一,以觀察程式的邏輯是否正確,然後逐步增加程序或執行緒的數量,以除錯程序或執行緒的同步是否正確。

gdb除錯多程序多執行緒

1.除錯多程序預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb v7.0 支援多程序的 分別以及同時 除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow fork mode 預設值 parent 和detach on fork 預設值 on 即可。接下來,首先介紹一下f...

gdb除錯多程序多執行緒

gdb是非常強大的unix及unix like下的程式除錯工具 gdb的使用 r或run 執行程式。list l 行號 顯示檔案源 接著上次的位置往下列,每次列10行。list l 函式名 列出某個函式的源 s或step 進入函式呼叫 breaktrace 或bt 檢視各級函式調 用及引數 info...

GDB 除錯多執行緒多程序

gdb是linux下的除錯利器,在c c 程式開發過程中必不可少的。這裡總結一下多程序和多執行緒的除錯方法和技巧。多程序的除錯 如下示例 include include include include include include static int glob 23 void test int ...