天天看點

gdb調試

 編譯 

gcc -g test.c -o test

啟動 

gdb test

1:檢視代碼

(gdb) list 行号

檢視指定行号附近的代碼。

(gdb) search keyword

查找目前檔案下一個keyword

(gdb) reverse-search keyword

查找目前檔案上一個keyword

2:執行程式

(gdb) run 可執行程式名

執行準備調試的程式

同時可以

使用(gdb) set args -x -y 來修改參數

使用(gdb) show args 擷取參數

3:資料顯示/修改

(gdb) print p

可以顯示目前變量p的值

print fun( 1, 2 ) 可以輸出函數傳回值

print *pmyptr 可以輸出複雜對象的值

print $1 可以輸出曆史記錄變量的值

(gdb) whatis p

可以顯示目前變量p的類型(對自定義結構無效)

(gdb) set variable 

對指定變量指派

(gdb) ptype p

擷取一個變量p的類型。(對自定義結構有效)

$pc 寄存器-程式計數器

$fp 寄存器-目前堆棧幀指針

$sp 寄存器-棧指針

$ps 寄存器-處理器狀态

4:斷點

(gdb) break filename.cpp:2202

可以讓程式在filename.cpp的2202行設定斷點

(gdb) breal filename.cpp:myfun if pparam==100

可以讓程式在filename.cpp檔案中的myfun函數處設定斷點,該斷點觸發條件為 pparam==100 為真時才有效。

通常斷點後可以使用

(gdb) backtrace 指令檢視調用堆棧表。

<上文中的break允許用一個字元b替代>

我們可以檢視目前程式項目的所有斷點清單,指令為

(gdb) info break

删除全部斷點,可使用下面指令

(gdb) delete breakpoint

删除一個斷點,可以使用下面指令

(gdb) delete breakpoint 1

則删除了編号為1的斷點。

禁止使用斷點 (gdb) disable breakpoint 1

允許使用斷點 (gdb) enable breakpoint 1

删除指定行上的斷點 (gdb) clean 2204

則删除了2204行上的斷點。

5:流程控制

(gdb) next

不進入函數内部的單步執行,可用一個字元n替代。

(gdb) step

進入函數内部的單步執行,可用一個字元s替代。

(gdb) finish

若進入了某函數,則直接執行至退出該函數體并顯示其傳回值。(void不顯示)。

(gdb) call funname( 167 )

直接調用執行一個函數funname,括号内加參數

(gdb) continue

當進入斷點後,希望繼續執行下去,則使用continue

6:多線程

(gdb) info threads

擷取目前程式的所有線程清單

(gdb) thread id

切換指定id的線程為目前調試線程

(gdb) break filename.cpp:1122 thread all

在所有線程的filename.cpp檔案中1122行設定斷點

(gdb) thread apply id1 id2 id3 command

在id1,id2,id3等一個或多個線程中執行gdb的command指令

(gdb) thread apply all command

在所有線程中執行gdb的command指令

(gdb) set scheduler-locking off (或on或step)

當off時,意味着所有線程正常執行。這個是預設狀态

當on時,意味着隻有目前調試的線程正常執行,其他線程将中斷。

當step時,意味着隻有目前調試的線程正常執行,但當next過一個函數後,所有線程正常執行。 

檢視資訊

info functions 檢視函數資訊

繼續閱讀