gdb的使用

使用gdb以前,首先要經過gcc的-g選項生成調試信息
$ gcc -g -Wall 源文件函數

啓動:
$ gdb 可執行文件測試

設置斷點:
break 斷點
break可簡寫爲b,斷點可經過函數名、文件內的行號等來設置,若是不指定斷點位置,就在下一行設置斷點。
設好的斷點能夠經過 info break來確認spa

條件斷點
break 斷點 if 條件
條件能夠爲測試變量的值。指針

運行:
run 參數
參數爲可執行文件須要的參數
start
效果等同在main設置斷點,而後執行到main函數。調試

顯示棧幀
backtrace 簡寫爲bt
bt N 顯示開頭N個棧幀
bt -N 顯示最後N個棧幀
bt full 不只顯示棧幀,還顯示局部變量。進程

顯示變量
print能夠顯示變量,簡寫爲p
p 變量名
p/格式 變量名
經常使用格式 x(十六進制)、d(十進制)、u(無符號十進制)、o(八進制)、t(二進制)、a(地址)、c(字符)、f(浮點)、s(字符串)、i(顯示機器語言 只在x命令中可用)ip

顯示寄存器
在寄存器名以前加$便可顯示其內容。
經常使用寄存器:$pc(也寫爲$eip ) 程序指針。內存

x命令:
格式爲 x/NFU ADDR
N爲重複次數
F爲前面講過的格式
U爲單位:b(字節)、h(2字節)、w(4字節)、g(8字節)
例:
x/10i $pc 顯示從pc所指地址開始的10條彙編指令。字符串

單步執行
next(簡寫爲n) 不會進入函數
step(簡寫爲p) 執行到函數內部it

繼續執行
continue
程序會在遇到斷點後再次暫停
continue 次數
指定次數能夠忽略N次斷點。

反覆執行
ignore 編號 次數
在編號指定的斷點、監視點或捕獲點忽略指定的次數。

 

運行程序,直到當前函數完成返回,並打印函數返回時的堆棧地址和返回值及參數值等信息。

finish

 

運行程序直到退出循環體
until (簡寫爲 u)


監視點
要找到變量在何處被改變,使用watch命令
watch 變量 改變時暫停運行
awatch 變量 被訪問、改變時暫停運行
rwatch 變量 被訪問暫停運行

刪除監視點和斷點
格式:delete <編號>

改變變量的值
set variable <變量>=<表達式>

attach到進程
要調試已經啓動的進程或是陷入死循環沒法返回的進程時,能夠使用attach命令
attach pid

斷點命令
commands 斷點編號
命令
end

獲取進程的內存轉儲
用ulimit命令查看當前的內核轉儲功能是否有效
ulimit -c
-c表示內核轉儲文件的大小限制。
開啓內核轉儲:
ulimit -c [size]
size表示轉儲文件的大小,設爲unlimited表示不限制大小。
通常轉儲文件會在當前目錄下生成。

gdb調試轉儲文件:
gdb -c [core] [executable file]

能夠看到程序錯誤緣由和在第幾行發生的錯誤

示例:
$ ./a.out
段錯誤 (核心已轉儲)

$ file core*
core: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style, from './a.out'

$ gdb -c core ./a.out
GNU gdb[...]
[New LWP 3586]
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x080483f5 in main () at 1.c:17
17 a->b = 2;

使用list命令能夠查看附近源代碼

(gdb) l
12 };
13
14 int main()
15 {
16 struct a *a = NULL;
17 a->b = 2;
18 return 0;
19 }

相關文章
相關標籤/搜索