使用gdb除錯多程序多執行緒除錯

2021-08-02 14:35:02 字數 2673 閱讀 9610

gdb常用命令表

backtrace(或bt):檢視各級函式呼叫及引數

finish:連續執行到當前函式返回為止,然後停下來等待命令

frame(或f):幀編號,選擇棧幀

info(或i):locals檢視當前棧幀區域性變數的值

list(或l):列出源**,接著上次的位置往下列,每次列10行

list行號:列出從第幾行開始的源**

list函式名:列出某個函式的源**

print(或p):列印表示式的值,通過表示式可以修改變數的值或者呼叫函式

quit(或q):退出gdb除錯函式

set var:修改變數的值

start:開始執行程式,停在main函式第一行語句前面等待命令

gdb與程序

#include#include#include#include#includeint main()

else if (id == 0)

else

return 0;

}

follow-fork-mode  detach-on-fork 

parent on       只除錯主程序(gdb預設)

child  on      只除錯子程序

parent off      同時除錯兩個程序,gdb跟主程序,子程序block(阻塞)在fork位置

child off       同時除錯兩個程序,gdb跟子程序,主程序block在fork位置

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

顯示方法:

show follow-fork-mode ;

show detach-on-fork;

查詢正在除錯的程序

:info inferiors

顯示gdb除錯的所有inferior,gdb會為他們分配id。其中帶有*的程序是正在除錯的inferior.

( gdb將每乙個被除錯程式的執行狀態記錄在乙個名為inferior的結構中。一般情況下乙個inferior對應乙個程序,每個不同的inferior有不同的位址空間。inferior有時候會在程序沒有啟動的時候就存在。)

切換除錯的程序:inferior

切換到id是num的inferior進行除錯。

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

增加n個inferior並執行程式為executable。如果不指定n只增加乙個inferior。如果不指定executable,則執行程式留空,增加後可使用file命令重新指定執行程式。這時候建立的inferior其關聯的程序並沒啟動。

remove-inferiors infno:

刪除乙個infno號的inferior。如果inferior正在執行,則不能刪除,所以刪除前需要先kill或者detach這個inferior。

detach inferior:

detach掉編號是infno的inferior。注意這個inferior還存在,可以再次用run命令執行它。

kill inferior infno: 

kill掉infno號inferior。注意這個inferior仍然存在,可以再次用run等命令執行它。

gdb與多執行緒

#include#includevoid* thread_run1()

void* thread_run2()

int main()

程式設計時,當我們需要除錯時,有時需要控制某些執行緒停在斷點,有些執行緒繼續執行。有時需要控制線程的執行順序。有時需要中斷某個執行緒,切換到其他執行緒。這都可以通過gdb實現。

gdb預設支援除錯

,跟主線程,子執行緒block在create thread。

先來看一下gdb除錯多執行緒常用命令:

info threads:顯示可以除錯的所有執行緒。gdb會為每個執行緒分配乙個id(和tid不同),編號一般從1開始。後面的id是指這個id。

thread id:切換當前除錯的執行緒為指定id的執行緒。

break filename.cpp:linunum thread all:

所有執行緒都在檔案filename.cpp的第linenum行有斷點。

多個執行緒執行gdb命令command。

:所有執行緒都執行command命令。

set scheduler-locking off|on|step:

在調式某乙個執行緒時,其他執行緒是否執行。off,不鎖定任何執行緒,預設值。on,鎖定其他執行緒,只有當前執行緒執行。step,在step(單步)時,只有被除錯執行緒執行。

set non-stop on/off:

當調式乙個執行緒時,其他執行緒是否執行。

set pagination on/off

:在使用backtrace時,在分頁時是否停止。

set target-async on/ff

:同步和非同步。同步,gdb在輸出提示符之前等待程式報告一些執行緒已經終止的資訊。而非同步的則是直接返回。

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