linux调试core-dump 文件的方法
在开发和使用Linux 程序时,引擎有时会莫名其妙的core 掉,在网上查了一下,整理了一个简单的调试core 文件的方法。
1、什么是core dump?
Core,即core memory,而dump 就是堆放的意思。core dump 又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core 文件中,叫core dump。
套用《Classis Shell Scripting》一书的解释:
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
浙公网安备 33010602011771号