This is the GNU debugger. Usage:
gdb [options] [executable-file [core-file or process-id]]
gdb [options] --args executable-file [inferior-arguments …]
调试core文件
配置环境
段错误 (核心已转储)
设置ulimit -c unlimited永久生效
vim /etc/security/limits.conf
修改后如下面两行
![在这里插入图片描述](https://img-blog.csdnimg.cn/6603edee70634ff496105d5ced497af5.png)
$ ulimit -c unlimied #表示不限制core文件大小
$ ulimit -c 10 #设置最大大小,单位为块,一块默认为512字节
设置core文件生成地址
vim /etc/sysctl.conf
添加一行:kernel.core_pattern=core-%e-%p-%t
sysctl -p
让配置立刻生效
总结
目前出现段错误,则core文件就会出现在当前执行目录下面。
$ gdb 程序文件名 core文件名
调试已运行程序
如果程序已经运行了怎么办呢?
首先使用ps命令找到进程id:
$ ps -ef|grep 进程名
或者:
$ pidof 进程名
attach方式
假设获取到进程id为20829,则可用下面的方式调试进程:
$ gdb
(gdb) attach 20829
定位crash问题—addr2line
有时候程序崩溃了但不幸没有生成core文件,是不是就完全没有办法了呢?还是cmdTest的例子。运行完cmdTest之后,我们通过dmesg命令可以获取到以下内容
|
|
1 |
[27153070.538380] traps: cmdTest[2836] trap divide error ip:40053b sp:7ffc230d9280 error:0 in cmdTest[400000+1000] |
该信息记录了cmdTest运行出错的基本原因(divide error)和出错位置(40053b),我们使用addr2line命令获取出错具体行号:
|
|
1 2 |
addr2line -e cmdTest 40053b /home/hyb/practice/cmdTest.c:4 |
可以看到addr2line命令将地址(40053b)翻译成了文件名(cmdTest.c)和行号(4),确定了出错位置。
小结
本节主要介绍了两种类型的GDB启动调试方式,分别是调试未运行的程序和已经运行的程序。对于什么样的程序能够进行调试也进行了简单说明。