gdp是GNU发布的一个强大的程序调试工具,它能够在程序执行过程中查看和修改变量的值、跟踪程序的执行流程、定位错误等。
1 一些基本用法:
-
必须首先使用
gcc -g
生成带有调试信息的可执行程序,否则调试的时候看到的将是一堆汇编代码。例如:(gdb) gcc -g program.c
-
启动 gdb 并加载程序:
使用gdb命令对生成的二进制文件a.out进行调试。(gdb) gdb a.out
-
查看源代码
list
命令(缩写为l
)用于查看程序的源代码。可以给list命令指定行号,可以查看该行所在位置附近的(10行)代码, 如list 15
(查看第15行附近的代码)。 -
搜索特定的内容
如果要查找变量result,则使用search命令(forward搜索,即向文件尾搜索)。
(gdb)search result
search命令会显示第一个符合条件的行,再次按回车键找到匹配的下一行代码。
需要backward搜索(朝向文件头),需要使用reverse-search
(gdb) reverse-search result
-
设置断点:
-
在想要设置断点的代码行上使用
break
命令。这个命令接受行号或者函数名作为参数。- 行号做参数:在
main
函数的第 10 行处设置断点:
(gdb) break 10 #在第10行设置断点
- 函数名作为参数来设置断点。
(gdb) break function_name
- 行号做参数:在
-
-
运行程序:
使用run
(缩写为r
)命令来运行程序至断点,程序中止,等待用户发出下一步操作指令。 -
调试过程:
- 当程序执行到断点时会暂停,在此时可以使用
next
(缩写为n
) 命令逐行执行代码。其中还可以设置连续执行多少行,如next 2
(连续执行2行)。 - 使用
step
(缩写为s
)命令进入函数内部,并逐语句执行。 - 使用
continue
(缩写为c
)命令继续执行直到下一个断点或程序结束。 - 使用
backtrace
(缩写为bt
)命令查看函数调用栈。
函数调用栈(Function Call Stack): 一个栈数据结构,程序调用函数的时候,其地址、参数、函数内的局部变量都会被压入栈中。通过查看函数调用栈,可以追踪函数之间的关系,观察函数参数和局部变量的值以及理解程序中错误产生位置。
- 当程序执行到断点时会暂停,在此时可以使用
-
查看和修改变量:
- 使用
print
(缩写为p
)命令可以打印变量的值。例如,print x
打印变量x
的值。 - 使用watch监视某个变量的值。例如
watch sum
, 当变量sum发生变化的时候,就会显示先前值与当前值以及产生变化的位置。 - 使用
set
命令修改变量的值。例如,set x = 10
将变量 x 的值设置为 10。
- 使用
-
退出 gdb:
在 gdb 中使用quit
(缩写为q
) 命令退出调试会话。