Linux下调试core dump 文件的方法

在开发和使用Linux 程序时,引擎有时会莫名
其妙的core 掉,在网上查了一下,整理了一个简
单的调试core 文件的方法。
1、什么是core dump?
Core,即core memory,而dump 就是堆放的
意思。core dump 又叫核心转储,当程序运行过
程中发生异常,程序异常退出时,由操作系统把
程序当前的内存状况存储在一个core 文件中,
叫core dump。
2、如何打开core dump支持?
有的操作系统并没有默认打开core dump 支
持,需要用ulimit -c unlimited 语句进行设置,
core 文件生成的位置一般在程序运行的当前目
录下,文件名为core. 进程号( 当然不同的系统
也许有所不同,可以查看相手册对路径和文件名
进行设置).
3、Core dump的使用方法
首先应该在用gcc 进行编译时选择-g 选项,
以便起动debug 支持,生成可执行文件时ex,./
ex 运行可执行文件,如果程序当掉,则会生成
一个core 文件,假设为core.1568,则gdb ex
core.1568 进入gdb,然后再用where 命令进行
查看即可。
先看看我用的是个什么机器:
$ uname -a
再看看默认的一些参数,注意core file size
是个0,程序出错时不会产生core 文件了。
$ ulimit -a
core file size (blocks, -c) 0
……
写个简单的程序,看看core 文件是不是会被
产生。
(代码略)
$ gcc -Wall -g foo.c
$ ./a.out
Segmentation fault
$ ls -l core.*
ls: core.*: No such file or directory
没有找到core 文件,我们改改ulimit 的设置,
让它产生。1024 是随便取的,要是core 文件大
于1024 个块,就产生不出来了。
$ ulimit -c 1024
$ ulimit -a
core file size (blocks, -c) 1024
……
$ ./a.out
Segmentation fault (core dumped)
$ ls -l core.*
-rw------- 1 uniware uniware 53248
Jun 30 17:10 core.9128
注意看上述的输出信息,多了个(core
dumped)。确实产生了一个core 文件,9128 是
该进程的PID。我们用GDB 来看看这个core。
$ gdb --core=core.9128
(输出信息略)
(gdb) bt
#0 0x08048373 in ?? ()
#1 0xbfffd8f8 in ?? ()
#2 0x0804839e in ?? ()
#3 0xb74cc6b3 in ?? ()
#4 0x00000000 in ?? ()
此时用bt 看不到backtrace,也就是调用堆栈,
原来GDB 还不知道符号信息在哪里。我们告诉
它一下:

(gdb) file ./a.out

(gdb) bt
#0 0x08048373 in sub () at foo.c:17
#1 0x08048359 in main () at foo.c:8
此时backtrace 出来了。
在程序不寻常退出时,内核会在当前工作目
录下生成一个core 文件(是一个内存映像,同时
加上调试信息)。使用gdb 来查看core 文件,可
以指示出导致程序出错的代码所在文件和行数。
其他总结
1.core文件的生成开关和大小限制
1)使用ulimit -c 命令可查看core 文件的生
成开关。若结果为0,则表示关闭了此功能,不
会生成core 文件。
2)使用ulimit -c filesize 命令,可以限制
core 文件的大小(filesize 的单位为kbyte)。若
ulimit -c unlimited,则表示core 文件的大小不
受限制。如果生成的信息超过此大小,将会被裁
剪,最终生成一个不完整的core 文件。在调试
此core 文件的时候,gdb 会提示错误。
2.core文件的名称和生成路径
core 文件生成路径:
输入可执行文件运行命令的同一路径下。
若系统生成的core 文件不带其他任何扩展名
称,则全部命名为core。新的core 文件生成将
覆盖原来的core 文件。
1)/proc/sys/kernel/core_uses_pid 可以控
制core 文件的文件名中是否添加pid 作为扩展。
文件内容为1,表示添加pid 作为扩展名,生成的
core 文件格式为core.xxxx ;为0 则表示生成的
core 文件同一命名为core。
可通过以下命令修改此文件:
echo “1″ > /proc/sys/kernel/core_uses_
pid
2)proc/sys/kernel/core_pattern 可以控制
core 文件保存位置和文件名格式。
可通过以下命令修改此文件:
e c h o “/ c o r e f i l e / c o r e -%e -%p -%t” >
core_pattern,可以将core 文件统一生成到/
corefile 目录下,产生的文件名为core- 命令
名-pid- 时间戳
3.core文件的查看
core 文件需要使用gdb 来查看。
gdb ./a.out
core-file core.xxxx
使用bt 命令即可看到程序出错的地方。
以下两种命令方式具有相同的效果,但是在
有些环境下不生效,所以推荐使用上面的命令。
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt
4. 开发板上使用core 文件调试
在 PC 上调试开发板上产生的core 文件,需
要使用交叉编译器自带的gdb,并且需要在gdb
中指定solib-absolute-prefix 和 solib-searchpath
两个变量以保证gdb 能够找到可执行程序
的依赖库路径。有一种建立配置文件的方法,不
需要每次启动gdb 都配置以上变量,即:在待运
行gdb 的路径下建立.gdbinit。
配置文件内容:
set solib-abso lute-prefix YOUR_CROSS_
COMPILE_PATH
s e t s o l i b - s e a r c h - p a t h Y O U R _ C R O S S _
COMPILE_PATH
set solib-search-path YOUR_DEVELOPER_
TOOLS_LIB_PATH
handle SIG32 nostop noprint pass
注意:待调试的可执行文件,在编译的时候需
要加-g,core 文件才能正常显示出错信息!有
时候core 信息很大,可以通过挂载到PC 的方式
来规避这一点.


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值