Linux嵌入式等其他场景中无调试选项,但我们在使用时需要调试时,就要使用到gdb调试工具。接下来将从使用方法和基本调试命令来介绍gdb工具。
使用方法
1. 准备可调试的程序
在编译程序时,需要加上-g
选项,这样编译器会在生成的可执行文件中包含调试信息。
gcc -g -o program program.c
这里-g选项用于生成调试信息,-o program指定生成的可执行文件名为program,program.c是源文件。
2. 启动 GDB
启动 GDB 并加载可执行文件
gdb program
3. 退出 GDB
使用quit(简写q)命令退出 GDB
(gdb) q
4.小秘诀
当什么命令都不打时直接按回车键就会默认再次输入上一条命令
基本调试命令
以下是需要调试的代码
#include <stdio.h>
#include <string.h>
void f(){
printf("this is f\n");
}
int i = 4;
int main(){
f();
i = 1;
return 0;
}
运行程序
run(简写 r):开始执行被调试的程序,如果程序需要命令行参数,可以在run
后面跟上参数,如(gdb) run arg1 arg2。
(gdb) r
设置断点
break(简写 b):在指定位置设置断点,程序执行到断点处会暂停。常见用法如下:
在某一行设置断点:(gdb) break 10,表示在源文件的第 10 行设置断点。
在某个函数入口设置断点:(gdb) break function_name,例如(gdb) break main,会在main函数入口处设置断点。
根据条件设置断点:(gdb) break 20 if x > 10,表示当变量x的值大于 10 时,在第 20 行设置断点。
我们在设置完断点之后可以使用info b去查看断点
info r
可以查看寄存器的值
可以看到我们在第四行、第八行和main函数处(第十一行)设置了断点
有设置断点当然也有删除断点
(gdb) d 断点号
单步执行
next(简写 n):单步执行程序,遇到函数调用时会将函数调用当作一步执行过去,不进入函数内部。
(gdb) n
step(简写 s):单步执行程序,遇到函数调用时会进入函数内部进行调试。
(gdb) s
继续执行
continue(简写 c):从当前位置继续执行程序,直到遇到下一个断点或程序结束。
(gdb) c
查看变量值
print(简写 p):打印变量的值。例如,要查看变量x的值,可以使用:
(gdb) p x
如果断点设置不当,程序可能还未执行到修改变量的代码行。例如,在修改变量的代码行之前设置了断点,且后续没有继续执行到修改变量的代码,那么使用p命令查看的仍然是变量的初始值。例如一下这种情况
设置调试界面的布局
layout src:开启源代码布局:
(gdb)layout src
运行时光标会停留在断点上,当我们使用命令继续运行时,光标会发生移动
当要退出时按下并释放 Ctrl 键,同时按下 X 键。松开所有按键后,再按下 A 键。
监查变量
当变量发生变化时就会停止
(gdb)watch 变量名
gdb调试工具还有更多的指令可以使用,以上列出的只是比较常用的命令