- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在开发和使用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
Linux localhost.localdomain 2.6.23.1-42.fc8 #1 SMP Tue Oct 30 13:55:12 EDT 2007 i686 i686 i386 GNU/Linux
再看看默认的一些参数:(注意core file size是个0,程序出错时不会产生core 文件了)
$ ulimit -a
如果未设置 ulimit –c unlimited corefile size就是0,即使core dump,也无法生产core文件。开发板上的一般如下图:
写个简单的程序,看看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 unlimited .有时候,在开发板上运行的时候,文件系统的空间不足,core文件无法生成,可以考虑用nfs挂载或者u盘挂载,将core生成到pc的nfs目录或者u盘相应的工作目录。
$ 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
注意看上述的输出信息,多了个(coredumped)。确实产生了一个core 文件,9128 是
该进程的PID。我们用GDB 来看看这个core。
$ gdb --core=core.9128
(输出信息略)
(gdb) bt
#0 0in ?? ()
#1 0xbfffd8f8 in ?? ()
#2 0x0804839e in ?? ()
#3 0xb74cc6b3 in ?? ()
#4 0in ?? ()
此时用bt 看不到backtrace,也就是调用堆栈,
原来GDB 还不知道符号信息在哪里。我们告诉
它一下:
(gdb) file ./a.out
(gdb) bt
#0 0in sub () at foo.c:17
#1 0in main () at foo.c:8
此时backtrace 出来了。
注意:有时候,gdb 可执行文件名 corefile,也会出现类似#0 0in ?? ()
#1 0xbfffd8f8 in ?? ()的打印,这个时候,需要看一下可执行文件是否strip过,用file 可执行文件名即可,比如:
[zc@localhost ysstb]$ file ysapp.exe
ysapp.exe: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped。
如果还是出先上面的情况,试试address2line,通过addr2line可以找到地址对应的文件名和行号
文档评论(0)