先看一下比較經典的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 檢視當前棧幀區域性變數的值...