GDB常用调试指令

本文介绍了GDB的常用调试命令,包括设置断点、查看源代码、单步执行、查看变量值、处理core文件等。通过掌握这些命令,可以更高效地进行程序调试。例如,使用`-g`选项编译程序以开启调试信息,利用`break`设置断点,`run`启动程序,`next`和`step`进行单步调试,`backtrace`查看调用栈,以及如何利用core文件进行故障排查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o main

 

常用命令

回车键:重复上一命令

(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h

(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r

(gdb)start:单步执行,运行程序,停在第一执行语句

(gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l

(gdb)set:设置变量的值

(gdb)next:单步调试(逐过程,函数直接执行),简写n

(gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s

(gdb)backtrace:查看函数的调用的栈帧和层级关系,简写bt

(gdb)frame:切换函数的栈帧,简写f

(gdb)info:查看函数内部局部变量的数值,简写i

(gdb)finish:结束当前函数,返回到函数调用点

(gdb)continue:继续运行,简写c

(gdb)print:打印值及地址,简写p

(gdb)quit:退出gdb,简写q

(gdb)break+num:在第num行设置断点,简写b

b 函数名
b 行号
b 文件名:行号
b 行号 if条件

(gdb)info breakpoints:查看当前设置的所有断点

(gdb)delete breakpoints num:删除第num个断点,简写d

(gdb)display:追踪查看具体变量值

(gdb)undisplay:取消追踪观察变量

(gdb)watch:被设置观察点的变量发生修改时,打印显示

(gdb)i watch:显示观察点

(gdb)enable breakpoints:启用断点

(gdb)disable breakpoints:禁用断点

(gdb)x:查看内存x/20xw 显示20个单元,16进制,4字节每单元

(gdb)run argv[1] argv[2]:调试时命令行传参

(gdb)set follow-fork-mode child#Makefile项目管理:选择跟踪父子进程(fork())

   core文件:先用$ ulimit -c 1024 开启core,当程序出错会自动生成core文件。调试时 gdb a.out core

ctrl+c:退出输入

gdb的命令行中输入list或者其简写l可以查看到程序的源码以及行号

如上输入l之后,默认会显示10行源代码,按回车之后会显示接下来的10行,直到文件的末尾。

在gdb命令行环境中输入wi命令,可以让我们进入可视化调试环境,这个环境可以看到源代码,所使用的调试命令与上面讲到的一致。

 

断点

保存断点到文件:save breakpoint fig.dp

加载断点:gdb hello2 -x fig.dp

 

打印

p <variable name>/print <variable name>可以查看某一个变量的当前值

print i (p i) 查看变量的值

ptype 查看变量类型

print array 查看数组

print *array@len 查看动态内存

print x=5 改变运行时的数据

print &array 查看数组的地址

 

core文件

在程序崩溃时,一般会生成一个文件叫core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生成的过程叫做core dump。

首先系统得设置了生成core文件,否则程序奔溃时也不会生成core文件。通过ulimit -a |grep core查看当前的配置。

结果可能如下:core file size          (blocks, -c) 0

如果结果如上,那么就需要设置core file的大小:ulimit -c 200

ulimit -c 数字 ,其中数字表示的是Blocks的个数,blocks的大小和系统有关。ulimit -c unlimited 则不限制生成的core文件大小

那么,如果用GDB加载已经生成的core文件呢?

假设测试程序是CoreTest,Core文件名为core.4393,那么通过gdb加载core文件的方式是:

gdb ./CoreTest core.4393

也就是说gdb 程序名 core文件名

 

参考资料

1. https://yq.aliyun.com/articles/243871

2. https://www.cnblogs.com/tangtangde12580/p/8045980.html

3. https://andrewpqc.github.io/2018/11/25/gcc-and-gdb/

4. https://blog.youkuaiyun.com/u011068702/article/details/53931648

 

扫描二维码,关注“小眼睛的梦呓”公众号,在手机端查看文章
扫描二维码,关注“清远的梦呓”公众号,在手机端查看文章
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值