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