平时使用的编译器自带调试功能,而在Linux下我们使用gdb来进行调试。GDB 全称“GNU symbolic debugger”是Linux常用的程序调试器。
gdb的使用前提
调试的前提是这个程序含有调试信息,否则是无法调试的。
gcc -o test test.c 这样生成的可执行程序不带调试信息,无法调试。
gcc -o test-debug test.c -g 想要生成的可执行程序可以调试只需要加上 -g 选项即刻。
同样的代码生成的 test 和 test-debug 大小却不一样,因为 test-debug 带有调试信息。
通过指令可以看到这些debug的调试信息。
调试方法
进入调试
使用 gdb 可执行程序名 就可以开始调试该程序,进入后可以使用 l 来查看源代码,l 0 从第0行开始,但一次只打印10行,因为其会记录上一条指令,多按几次回车即刻查看完整的代码。
常用调试指令
指令 | 用法 | 作用 |
---|---|---|
quit 简写 q | 直接输入q,然后回车即可 | 退出gdb |
list 简写 l | (1)l 文件名:行号 (2)l 文件名:函数名 (3)l 行号 (4)l 函数名 | 查看任意位置的源代码 |
b | (1)b 文件名:行号 (2)b 文件名:函数名 (3)b 行号 (4)b 函数名 | 在任意位置打断点 |
info 简写 i | i b | 查看断点 |
d | d 断点编号(创建断点时,断点会从1开始作为编号) | 删除断点 |
disable/enable | disable/enable 断点编号 | 关闭断点/开启断点 |
next 简写 n | n | 逐过程执行(F10) |
step 简写 s | s | 逐语句执行(F11) |
print 简写 p | p 变量名(p a 或 p &a) | 查看变量值(监视) |
display | diaplay a 或 diaplay &a | 常显示变量值(监视窗口) |
undisplay | undiaplay 常显示变量编号 | 取消常显示 |
continue | c | 运行至下一个断点 |
finish 简写 f | f | 运行完当前函数 |
until 简写 u | u 指定行 | 运行到指定行 |
run 简写 r | r | 开始执行 |
断点注意事项:哪怕前面的断点被删除,也不影响后面的编号。如图编号为1的断点被删除后,只剩下编号为2的断点,但再创建断点其编号还是3。
display的编号同理。
关闭断点后Enb属性显示n,此时断点不生效。