GDB除錯 多程序與多執行緒程式

2021-08-02 03:07:21 字數 2810 閱讀 3388

先看一下比較經典的gdb部落格:

用gdb除錯程式(一)

用gdb除錯程式(二)

一、gdb常用命令

二、gdb與多程序

預設設定下,在除錯多程序程式時gdb只會呼叫主程序,但是gdb(>v7.0)支援多程序的分別與同步除錯。即gdb支援同時除錯多個程序。只需要設定follow-fork-mode(預設為 parent)和detach-on-fork(預設為:on)即可。

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。其中帶*的程序是正在除錯的程序。

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

切換除錯的程序:inferior

通過該指令可以切換到id為number的inferior進行除錯。

調加新的除錯程序:add-inferior[-copies n][-exec executable]

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

刪除乙個infnum 的inferior:remove-inferiors infnum(如果inferior正在執行,則不能刪除,刪除之間需先kill或detach掉該inferior)

detach掉infnum的inferior:detach inferior infnum注意(inferior仍然存在,可以用run等命令執行)

kill 掉infnum的inferior:kill inferior infnum注意(inferior仍然存在,可以用run等命令執行)

三、gdb與多執行緒

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

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

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

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

四、設定core

core的意思是核心,dumped的意思就是丟擲,轉儲,core  dumped就是核心轉儲的意思。當乙個程序異常退出前,該程序會丟擲當時該程式程序的記憶體詳細情況儲存在硬碟上,檔名通常是core,這就叫core  dump。

程序異常終止通常是因為**存在bug,比如非法記憶體訪問導致段錯誤,事後可以用偵錯程式檢查core檔案以查清錯誤原因,這叫做事後除錯.

uname  -a   檢視機器引數

ulimit  -a   檢視預設引數

ulimit   -c   1024     設定core檔案大小為1024

ulimit  -c   unlimit   設定core檔案大小為無限

eg1(可以快速定位出問題的位置)

gdb  a.out  core.***

where

eg2    (在  gdb  中使用)  

(gdb) core-file  core.***

gdb除錯多程序與多執行緒

gdb是linux下的 除錯工具,在使用時要加 g選項,開始 gdb file 退出 ctrl d或q。gdb除錯多程序與多執行緒預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb v7.0 支援多程序的分別以及同時除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow fo...

gdb除錯多程序與多執行緒

list l 行號 顯示binfile源 接著上次的位置往下列,每次列10行。list l 函式名 列出某個函式的源 r或run 執行程式。s或step 進入函式呼叫 breaktrace bt 檢視各級函式呼叫及引數 info i locals 檢視當前棧幀區域性變數的值 info break 檢...

GDB除錯多程序與多執行緒

gdb除錯過程中常用命令 list l 行號 顯示binfile源 接著上次的位置往下列,每次列10行。list l 函式名 列出某個函式的源 r或run 執行程式。s或step 進入函式呼叫 breaktrace bt 檢視各級函式呼叫及引數 info i locals 檢視當前棧幀區域性變數的值...