一、除錯的指令
1.list命令
list linenum 顯示程式第linenum行的周圍的程式
list function 顯示程式名為function的函式的源程式
list 顯示當前行後面的源程式
list - 顯示當前行前面的源程式
2.run(r):執行命令
run args run命令可以直接接命令列引數值,也可以在執行run之前通過 set args + 引數值實現
3.break(b):打斷點
b linenum 在某行打斷點
b +offset/-offset 在當前行的前面或者後面的offset停住
b filename:linenum 在某檔案的某行打斷點
b filename:function 在某檔案某個函式入口處停住
b *address 在程式的執行位址處停住
b 沒有引數在下一行停住
b where if condition 在滿足條件的那一行停住
關閉斷點:delete(d) breakpoint -id
4.單步命令:
step count 一次性執行count步,有函式進入函式
next count 一次性執行count步,不進入函式
finish 執行函式,知道當前函式完成返回,並列印出函式返回時的堆疊位址、返回值和引數資訊
until 退出迴圈體
5.continue命令:
當程式被停住後,可以使用continue(c)命令,恢復程式的執行直到程式結束,或到達下乙個斷點
6.print(p)命令:
print命令針對變數的輸出格式:
x 按十六進製制格式顯示變數
d 按十進位制格式顯示變數
u 按十六進製制格式顯示無符號整型退出
o 按八進位制格式顯示變數
t 按二進位制格式顯示變數t 按二進位制格式顯示變數
a 按十六進製制格式顯示變數
c 按字元格式顯示變數
f 按浮點數格式顯示變數
7.watch命令:
watch命令一般用來觀察某個表示式(變數也是一種表示式)的值是否有變化,如果有變化,馬上停住程式
設定觀察點的方法:
watch expr 為表示式expr設定乙個觀察點一旦表示式的值有變化,馬上停止程式
rwatch expr 當表示式被讀是,停住程式
awctah expr 當表示式的值被讀或者背寫時,停住程式
8.exammine命令:
9.jump命令
jump命令不會改變程式棧的內容,一般只在同一函式內跳轉。
jump linespec 指定下一條語句的執行點,linespec可以是linenum,filename+linenum,+offset這幾種形式
jump address 跳到**行的位址
10.signal命令
使用signal 訊號名(如sigint)這種方式把訊號傳送給程式,如果程式註冊了signal_handler函式,還可以進行相應的處理,幫助除錯程式
11.set命令
set args 設定命令列引數
set env environmentvarname=value 設定環境變數。如:set env user=benben
12.call命令
call function 強制呼叫某函式
強制呼叫某函式,它會顯示函式返回值(如果函式返回值不是void)。print命令也可以完成該功能
13.disassemble命令
反彙編命令,檢視源**的機器碼
二、多程序除錯
1.單獨除錯子程序
我們可以先執行程式,然後再另一終端使用ps -ef | grep "main"(main此處是可執行檔名)搜尋到子程序pid,然後啟動gdb,在將其附加(attach)到gdb偵錯程式上
attach child-pid 使用該命令後,直接run即可,和除錯普通程式就沒區別了
dettach 脫離程序
2.使用偵錯程式選項follow-fork-mode
我們知道如果不設定任何選項,gdb預設除錯父程序。偵錯程式選項用法如下:
set follow-fork-mode mode 其中mode的可選值是parent和child,分別表示除錯父程序和子程序。
info inferiors 查詢正在除錯的程序
inferior processnum 切換程序
預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb(>v7.0)支援多程序的分別以及同時除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow-fork-mode(預設值:parent)和detach-on-fork(預設值:on)即可。我們還可以使用catch fork指令,如果fork異常,會停止程式。
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]
三:多執行緒除錯
gdb除錯一般有兩種模式:all-stop模式和no-stop模式(gdb7.0之前不支援no-stop模式)。
1.all-stop模式
在這種模式下,當你的程式在gdb由於任何原因而停止,所有的執行緒都會停止,而不僅僅是當前的執行緒。一般來說,gdb不能單步所有的執行緒。因為執行緒排程是gdb無法控制的。無論什麼時候當gdb停止你的程式,它都會自動切換到觸發斷點的那個執行緒。
2.no-stop模式(網路程式設計常用)
顧名思義,啟動不關模式。當程式在gdb中停止,只有當前的執行緒會被停止,而其他執行緒將會繼續執行。這時候step,next這些命令就只對當前執行緒起作用。
gdb支援的命裡有兩種型別:前台的(同步的)和後台(非同步 )的。區別很簡單,同步的在輸出提示符之前會等待程式report一些執行緒已經終止的資訊,非同步則是直接返回。所以我們需要set target-async 1。set pagination off不要出現 type to continue 的提示資訊 。最後一步是開啟。
下面是常用命令:
info threads 顯示所有執行緒
thread id 切換到指定執行緒
break filename:linenum thread all 在所有執行緒相應行設定斷點,注意如果主線程不會執行到該行,並且啟動all-stop模式,主線程執行n或s會切換過去
set scheduler-locking off|on\step 預設off,執行s或c其它執行緒也同步執行。on,只有當前相稱執行。step,只有當前執行緒執行
show scheduler-locking 顯示當前模式
主要是我們要用能用的上的,比如no-stop模式,一般多執行緒除錯就很有用的。
gdb pid 執行緒 gdb多執行緒除錯
死鎖除錯 1 g引數 2 attach 3 info threads void workthread void arg pthread mutex t mutex pthread mutex init mutex,0 usleep 1000 1000 fprintf stderr,timeout w...
gdb pid 執行緒 gdb除錯多執行緒
gdb 多執行緒除錯基本命令 實現簡介 以及乙個問題的解決 teawater gmail.com 一直對gdb多執行緒除錯接觸不多,最近因為工作有了一些接觸,簡單作點記錄吧。如果程式是多程序在跑,先將其設定成單程序模式 kamailio 檢視程序中所有執行緒的棧呼叫 pstack 程序pid pst...
gdb除錯多程序多執行緒
1.除錯多程序預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb v7.0 支援多程序的 分別以及同時 除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow fork mode 預設值 parent 和detach on fork 預設值 on 即可。接下來,首先介紹一下f...