gdb除錯多程序多執行緒

2021-08-02 04:14:22 字數 2562 閱讀 4617

1.除錯多程序預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb(>v7.0)支援多程序的

分別以及同時

除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow-fork-mode(預設值:parent)和detach-on-fork(預設值:on)即可。

接下來,首先介紹一下follow-fork-mode和detach-on-fork

設定方法:set follow-fork-mode [parent|child]   set detach-on-fork [on|off]

查詢正在除錯的程序:info inferiors

切換除錯的程序: inferior

新增新的除錯程序: add-inferior [-copies n] [-exec executable] ,可以用file executable來分配給inferior可執行檔案。

接下來看乙個例項:

除錯**有兩個程序,父程序執行processa函式,子程序執行processb函式

#include#include #includevoid processa();

void processb();

int main(int argc, const char *argv)

else//father

return 0;

}void processa()

void processb()

我們在fork處設定斷點,並且設定set follow-fork-mode 和

set detach-on-fork ,同時除錯兩個程序,gdb跟進主程序。然後主程序執行一步,會提示有乙個新程序被建立。

我們檢視一下正在除錯的程序

我們可以看到有兩個程序正在被除錯,gdb跟進的1這個程序,也就是主程序。現在我們切換到子程序,也就是切換到2這個程序,也就是子程序。

此時可以看到,已經切換到子程序了,

因為子程序執行的processb函式,所以我們在此函式處下乙個斷點,並且通過continue命令執行到該斷點處停下來。

我們可以看到在processb處已經停了下來,使用n命令將子程序除錯完

現在切到主程序,繼續除錯主程序即可。

2.除錯多執行緒:

首先看一下除錯多執行緒經常使用的命令

接下來看一下除錯**,

#include#include #include #include void * fun1 (void *arg1)  

void * fun2 (void *arg1)

int main(void)

if (pthread_create (&pid2, null, fun2, null))

if (pthread_join (pid1, &tmp))

if (pthread_join (pid2, &tmp))

sleep (2);

printf ("[main] -- end\n");

return 0;

}

我們在建立執行緒的時候設定斷點,然後切換到除錯單一執行緒的模式,然後執行一步,可以看到新執行緒被建立。

現在檢視一下正在除錯的執行緒,會看到有兩個,並且gdb跟進的是主線程,然後我們把它切換到子執行緒

我們可以看到,已經在函式處停止了,接下來,我們一步步將子執行緒除錯完,切回到主線程。

現在可以繼續除錯主線程了。以上就是gdb對多執行緒多程序的簡單除錯

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 ...

GDB除錯多執行緒 多程序

用gdb除錯多程序程式 如果乙個程序通過fork系統呼叫建立了子程序,gdb會繼續除錯原來的程序,子程序則正常執行。那麼該如何除錯子程序呢?單獨除錯子程序 子程序從本質上說也是乙個程序,因此我們可以用通用的gdb除錯方法來除錯他。舉例來說如果要除錯乙個伺服器中的某乙個子程序,我們可以先執行伺服器,然...