gdb 调试程序

gdb 调试程序

gdb查看内存错误

1.允许生成core-dump文件

程序发生内存错误时而退出时,会生成一个core dump文件保存相关信息,用这个文件可以排查内存错误。

使用命令 ulimit -c 查看core开关,如果为0表示关闭,不会生成core文件。ulimit -a 查看信息会全一些

ulimit -c
ulimt -a

通过设置文件大小无限制,来允许生成core-dump文件

ulimit -c unlimited

通过将该命令加入~/.bashrc文件,来让每一次新环境下该设置都会生效

echo "ulimit -c unlimited">~/.bashrc

2.设置文件生成路径

首先需要设置程序崩溃时生成的core dump文件的生成路径,该步需要在root用户下设置

su
echo "你准备放core dump文件的路径/core-%e-%p-%t">/proc/sys/kernel/core_pattern
exit
  • 参数含义

%p - insert pid into filename 插入当前的pid

%u - insert current uid into filename 插入当前的uid

%g - insert current gid into filename 插入当前的gid

%s - insert signal that caused the coredump into the filename 插入导致产生core文件的信号

%t - insert UNIX time that the coredump occurred into filename 插入core文件生成时的时间

%h - insert hostname where the coredump happened into filename 插入主机名

%e - insert coredumping executable name into filename 插入程序名

3. debug模式编译程序并运行

ros程序catkin_make 的debug模式编译

catkin_make -DCMAKE_BUILD_TYPE=Debug

gcc的debug模式编译, 编译时通过添加-g 选项参数使程序生成可调试的信息

然后运行程序

4.gdb查看core-dump文件定位错误

发生错误后,会在设置的文件夹下生成对应的core文件,此时运行

gdb 发生错误的程序文件 core文件 

然后执行bt,看堆栈信息了,这样可以查看内存错误在什么地方发生的。

gdb调试程序

GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。

image-20220529095426163

gdb是一个功能强大的程序调试工具,gdb工具是很多IDE调试程序的基础,用它可以很方便的进行程序的调试。gdb调试的程序需要是带调试信息的debug程序,如果是gcc则需要带参数-g,而相对于 -O -g 选项,对 GDB 调试器更友好的是 -Og 选项,-Og 对代码所做的优化程序介于 O0 ~ O1 之间,真正可做到“在保持快速编译和良好调试体验的同时,提供较为合理的优化级别”。

在生成了带调试信息的程序后,使用gdb调试程序的方法为

gdb 可执行程序

image-20220529101307234

常用命令

调试指令含义
l/list显示源程序代码的内容,包括各行代码所在的行号
b + 行号在源代码指定的某一行设置断点,其中 xxx 用于指定具体打断点的位置。
run/r执行被调试的程序,其会自动在第一个断点处暂停执行。
n/next令程序一行代码一行代码的执行。
p + xxx印指定变量的值,其中 xxx 指的就是某一变量名。
c/continue当程序在某一断点处停止运行后,使用该指令可以继续执行,直至遇到下一个断点或者程序结束。
q/quit终止调试。

另外,虽然 Linux 系统下读者编写 C/C++ 代码的 IDE 可以自由选择,但调试生成的 C/C++ 程序一定是直接或者间接使用 GDB。很多 C/C++ 项目的开发和调试包括故障排查都是利用 GDB 完成的,调试是开发流程中一个非常重要的环节,因此对于从事 Linux C/C++ 的开发人员熟练使用 GDB 调试是一项基本要求。

参考

GDB是什么? (biancheng.net)

GDB调试教程:1小时玩转Linux gdb命令 (biancheng.net)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值