GDB调试
启动程序准备调试
gdb test
然后使用run或者r命令开始程序的执行
用gcc编译时要加 -g:gcc -g -o test test.c
开始调试: gdb test
打断点: (gdb) b+(函数名或者行号)
开始执行: (gdb) r
单步调试: (gdb) s
打印值: (gdb) p+(变量名)
查看函数调用信息:(gdb) bt
参数列表
|
命令 |
命令缩写 |
命令说明 |
|
list |
l |
显示多行源代码 |
|
break |
b |
设置断点,程序运行到断点的位置会停下来 |
|
info |
i |
描述程序的状态 |
|
run |
r |
开始运行程序 |
|
display |
disp |
跟踪查看某个变量,每次停下来都显示它的值 |
|
step |
s |
执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句 |
|
next |
n |
执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句) |
|
|
p |
打印内部变量值 |
|
continue |
c |
继续程序的运行,直到遇到下一个断点 |
|
set var name=v |
|
设置变量的值 |
|
start |
st |
开始执行程序,在main函数的第一条语句前面停下来 |
|
file |
|
装入需要调试的程序 |
|
kill |
k |
终止正在调试的程序 |
|
watch |
|
监视变量值的变化 |
|
backtrace |
bt |
查看函数调用信息(堆栈) |
|
frame |
f |
查看栈帧 |
|
quit |
q |
退出GDB环境 |
----------------------------------------
GDB堆栈跟踪的方法
----------------------------------------
程序“调用堆栈”是当前函数之前的所有已调用函数的列表(包括当前函数)。每个函数及其变量都被分配了一个“帧”,
最近调用的函数在 0 号帧中(“底部”帧)。要打印堆栈,发出命令 'bt'('backtrace' [回溯] 的缩写):
(gdb) bt
#0 0x80483ea in wib (no1=8, no2=8) at eg1.c:7
#1 0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
此结果显示了在 main() 的第 21 行中调用了函数 wib()(只要使用 'list 21' 就能证实这一点),而且 wib() 在 0 号帧中,
main() 在 1 号帧中。由于 wib() 在 0 号帧中,那么它就是执行程序时发生算术错误的函数。
实际上,发出 'info locals' 命令时,gdb 会打印出当前帧中的局部变量,缺省情况下,这个帧中的函数就是被中断的函数(0 号帧)。
可以使用命令 'frame' 打印当前帧。要查看 main 函数(在 1 号帧中)中的变量,可以发出 'frame 1' 切换到 1 号帧,
然后发出 'info locals' 命令:
(gdb) frame 1
#1 0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
21 result = wib(value, div);
(gdb) info locals
value = 8
div = 8
result = 4
i = 2
total = 6

695

被折叠的 条评论
为什么被折叠?



