編譯
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 檢視函數資訊