`
javatoyou
  • 浏览: 1027587 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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 的方式
来规避这一点.


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics