本機調試
帶參數啟動
gdb --args ./program arg1 arg2 arg3
在main()處斷點
break main
啟動以後設置參數運行
run arg1 arg2 arg3
取消參數開始運行
set args
run
設置參數
set args arg1 arg2 arg3
run
分析core文件
gdb ./test ./test.core
gdb --core=./test.core ./test
gdb ./test 2640
gdb --pid=2640 ./test
遠程調試
目標機器
gdbserver 127.0.0.1:1234 ./test
主機:
target remote 127.0.0.1:1234
break main
run
調試控制命令:
step 單步,參數N表示單步幾次,一般可以用作步入到 子函數 調用中去。(vc++的F11,windbg的t)
stepi 指令集的step,一般在匯編窗口調用。
next 類似單步,只不過把子函數調用當做一個指令預先執行掉,不跟進去。(vc++的F10,windbg的p)
nexti 指令集的next,一般在匯編窗口調用。
until 執行到比當前行號大的一行為止。用作步出循環體,這個時候剛好在循環體的最後一行,可以執行這個步出循環。
finish 執行到當前棧即將返回的位置。用於將當前函數執行完畢返回。(vc++的shift+F11,windbg的pt,tt,wt)
advance 推進到某個位置advance 27表示推進到27行,(vc++的ctrl+F11, windbg的pa, "step to address")
jump 跳到某個指令直接執行, jump 27 直接跳到27行開始執行,最好在27行之後某個位置斷點一個看看。(windgb的r eip=0x41000100)
斷點指令:
break main 函數名斷點
break test.c : 27 文件的27行斷點
break *0x00000000004005f0 在匯編指令的地址處斷點, 前面有一個星號
硬件數據斷點
awatch 訪問斷點access watch; awatch i, 當i被訪問的時候,程序斷開。(類似於windbg的ba斷點)
watch 寫入數據斷點,watch i 當i的值被修改的時候,斷開。
rwatch 讀取斷點, 當i的值被讀取的時候斷開。
hbreak 硬件指令斷點, hbreak *0x0000000000400606 在這個地址設置硬件斷點
條件斷點:
在循環體的11行斷點,只有循環計數器是20的時候斷開。
www.2cto.com
(gdb) break 11 if i=20
Breakpoint 2 at 0x4005c9: file test.cxx, line 11.
(gdb) info breaks
Undefined info command: "breaks". Try "help info".
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004005c0 in foo() at test.cxx:9
breakpoint already hit 1 time
2 breakpoint keep y 0x00000000004005c9 in foo() at test.cxx:11
stop only if i=20
(gdb) c
Continuing.
0
Breakpoint 2, foo () at test.cxx:11
11 printf("%d\n",i);
(gdb) p i
$1 = 20
數據查看命令:
print 打印變量的值,print i, 查看變量i當前的值。
x 內存檢查, Examine the memory, x /nfs n=count of unit to examine. f=format,(x=hex; d=decimal, c=char); s=sizeof of unit
display 每次gdb獲得控制的時候,打印變量的值,display i; 在單步的時候,每次查看i的變化;
棧操作指令:
info stack 查看當前線程棧的情況,看函數調用鏈。類似於bt;
backtrace, 棧回溯
info frame 查看當前函數幀的信息。
up 往調用鏈的上游移動,看看caller是誰。
down 往調用鏈的下游移動,看看callee是誰。
frame 2 移動到第二個幀(count from callee->caller)
return 從選定棧執行返回到caller, 和finish類似的功能, 很好的一個功能哦.