一、使用GDB调试一个简单的程序
helloworld.c,代码如下:
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
编译,注意必须使用-g,以生成带调试信息的可执行程序
gcc -g helloworld.c -o hello
对hello程序,进行调试
gdb hello
运行hello
r
也可以在启动前通过其他命令设置断点,一步一步调试。
二、GDB命令详细介绍
1、流程控制相关
命令 | 描述 |
---|---|
r | run,启动被调试的程序 |
ctrl+c | 中断正在执行的程序 |
c | continue,继续执行 |
s | step,单步跟踪,如果有函数调用,会进入该函数 |
n | next,单步跟踪,如果有函数调用,不会进入该函数 |
Ctrl+X+A | 打开当前执行位置源文件,可配合打断点,做到跟踪执行时实时查看该位置源码 |
2、断点相关
命令 | 描述 |
---|---|
b 100 | break,在当前文件中第100行,设置断点 |
b xx.c:100 | break,在xx.c文件中第100行,设置断点 |
p xx.c:100 if aa==20 | 条件断点,当变量aa==20时,xx.c中第100行代码处断点生效 |
clear 100 | 删除当前文件中第100行处的断点 |
clear xxx.c:100 | 删除xxx.c文件中第100行处的断点 |
save breakpoints ./xxx.brk | 把所有的断点保存到xxx.brk文件中 |
ib | info breakpoints,查看所有的断点信息 |
disable | 禁用断点,缩写为dis |
enable | 启用断点 |
d | delete可删除单个断点,也可删除一个断点的集合。如果只输入d,不加任何参数,则表示删除所有断点。 |
3、调用堆栈相关
命令 | 描述 |
---|---|
bt | backtrace,查看程序调用堆栈信息 |
frame N | 切换到第N层栈帧,程序实际执行位置为第0层,往上依次1,2,3,… |
up N | 表示在当前栈帧编号(假设为M)的基础上,切换到M+N编号的栈帧 |
down N | 表示在当前栈帧编号(假设为M)的基础上,切换到M-N编号的栈帧 |
4、查看内存相关
命令 | 描述 |
---|---|
p xx | 打印变量或表达式xx的值 |
p /x *buf@128 | 对于unsigned char* buf = malloc(256)时,表示以16进制格式,打印buf开始连续128字节内容 |
p /x * (unsigned int*)buf@32 | 对于unsigned char* buf = malloc(256)时,表示将buf按连续4字节看作一个元素,以16进制格式,打印buf开始连续32个元素内容。 效果如下:{0x11223344, 0x55667788, …}。 |
display xx | 跟踪查看一个变量xx,每次停下来都显示它的值 |
set var xx=47 | 修改变量xx的值为47 |
watch xx | 观察xx的值,当有变化时,停止 |
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。