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

2021-08-02 03:54:13 字數 2586 閱讀 9645

其實,我們在vs編譯器中用的除錯工具是整合的軟體,但是在linux中有特定的工具gdb,其實這是乙個很強的工具,我其實用的不是很6,其實這個真的強,希望大家和我一樣努力的來學習使用gdb除錯;在這先推薦乙個大神陳皓,部落格已經不更新了但是還是有很多內容比如gdb除錯

其實在陳皓大神的這個系列中,我們可以get很多的技能;

在gdb除錯中,預設的除錯是父程序,當我們在程式中fork出乙個子程序後,就不能達到除錯子程序的目的,因此,gdb中肯定就會設定除錯子程序的

set follow-fork

-mode child/parent

上述的命令就是在gdb中除錯的時候可以選擇gdb除錯的是父程序還是子程序;

set follow-fork

-mode child //gdb除錯子程序

set follow-fork

-mode

parent

//gdb除錯父程序

我們先展示一下我們的測試**:

#include

#include

#include

int main()

}else

}return

0;}

在gdb除錯之前,我們隊目標檔案編譯的時候必須在 編譯後面加 -g才能正確的進入gdb的除錯:

在上圖中,我們可以看到我什麼也沒有新增的除錯後,直接進入的父程序,跳過了子程序;所以:gdb預設除錯的父程序;

結合上圖,我們可以看到的是,在子程式除錯完後,直接就到24行退出;

其實在我們這個gdb除錯中,父程序也可以用 set follow-fork-mode parent,也可以直接除錯,畢竟預設的也是除錯父程序;

在gdb除錯多程序中還有乙個除錯的命令: set detach-on-fork on/off;

兩個命令的聯絡如下:

follow-fork-mode

detach-on-fork

說明parent

ongdb預設的除錯方式;值除錯主程序

child

on只除錯子程序

parent

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

child

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

所以,我們可以用上述命令除錯多程序的程式:

我們在看到所有執行的程序後,可以選擇除錯那個程序:

執行緒建立提醒

在gnu/linux上,如果gdb檢測乙個新的執行緒,會給出如下通知:

查詢已經建立的執行緒

執行緒切換

thread threadno可以切換到指定的執行緒,threadno就是上面gdb分配的執行緒id號

鎖定乙個執行緒

預設情況下,gdb不鎖定任何執行緒:在切換到執行緒2中後,列印的不只是執行緒2中的資料,也還有執行緒3中的內容:

可以使用set scheduler-locking on來鎖定只有當前執行緒的操作:不會執行其他執行緒的結果

除錯某個執行緒是其他執行緒是否執行

鎖定其他執行緒,只有當前執行緒執行

不鎖定任何執行緒,預設值

在單步時,只有被除錯執行緒執行

執行緒除錯的其他命令:

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

gdb常用命令表 backtrace 或bt 檢視各級函式呼叫及引數 finish 連續執行到當前函式返回為止,然後停下來等待命令 frame 或f 幀編號,選擇棧幀 info 或i locals檢視當前棧幀區域性變數的值 list 或l 列出源 接著上次的位置往下列,每次列10行 list行號 列...

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