分析核心(core)文件
在程序发生崩溃时,有时可能无法直接运行GDB来进行调试。比如程序可能是在另外一台机器上运行的,或者因为程序对时间比较敏感,所以手动跟踪调试会产生
无法接受的延迟等。遇到这些情况,就只能等到程序运行结束后才能判断崩溃的原因了。这时需要用到Linux提供的core
dump机制。当程序中出现内存操作错误时,会发生崩溃并产生核心文件。使用GDB可以对产生的核心文件进行分析,找出程序是在什么时候崩溃的和在崩溃之
前程序都做了些什么。当然,如果要用GDB来分析核心文件,也必须在编译时加上-g选项来产生调试符号表。
在分析核心文件之前必须确认系统是否允许生成核心文件,很多Linux发行版在默认时禁止生成核心文件。为了生成核心文件,首先必须执行下面的命令:
#
ulimit -c unlimited
然后就可以生成核心文件了。
$ uname -a
Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004
i686 i686 i386 GNU/Linux
再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了。
$ ulimit -a
core file size (blocks, -c)
0
data seg size (kbytes, -d) unlimited
file size (blocks, -f)
unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m)
unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size
(kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes
(-u) 7168
virtual memory (kbytes, -v) unlimited
这里仍以前面的debugme程序为例,再次执行下面命令将产生核心文件:
# ./debugme
Enter a string to count words:Happy new year!
The number of words is 3.
Segmentation fault (core dumped)
|
生成的核心文件名根据系统配置的不同会有所差异。要在GDB中分析核心文件,除了要给出核心文件的文件名外,还必须给出生成该核心文件的可执行程序的名称,示例如下:
#gdb debugme core.547
……
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libc.so.6...done.
……
|
从GDB的输出信息中可以看出,产生这个核心文件的原因是因为程序收到了序号为11的信号。如果想知道程序在崩溃之前运行到了哪里,可以使用“backtrace”或“info
stack”命令查看一下堆栈的历史记录。示例如下:
(gdb) info stack
#0 0x4000c6ac in _dl_fini () from /lib/ld-linux.so.2
#1 0x40057940 in exit () from /lib/libc.so.6
#2 0x4004291f in _libc_start_main () from /lib/libc.so.6
|
由上可知,程序崩溃时正处于_dl_fini()函数之中。但很多时候程序员感兴趣的可能并不是这个,而是exit()或_libc_start_main()函数,因为它们才可能是问题真正的症结所在。GDB提供的“frame”命令可以用来在不同的调用上下文中切换。例如下面的命令可以查看exit()函数在执行时的状况:
(gdb) frame 1
#1 0x40057940 in exit () from /lib/libc.so.6
|
此外还可以用“up”或“down”命令在不同的函数调用上下文中切换。开发人员使用这三条命令可以很轻松地实现调用栈的遍历。在分析核心文件时,通过将遍历栈的命令和检查变量值的“print”命令结合起来,就能够复原程序运行时的全部景象。
分享到:
相关推荐
Linux下怎么产生core dump文件及GDB怎么调试core.pptx Linux下怎么产生core dump文件及GDB怎么调试core.pptx
非常详细的介绍 Linux下gdb调试工具指南
UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。于是UNIX下的软件比Windows下的...
GDB常用命令,调试core文件最常用的
讲述常用gdb命令,以及讲述如何使用gdb调试程序崩溃后产生的core dump文件,让您在linux下开发更轻松
使用GDB调试,英文版。对于从事 Linux C/C++ 后台开发的读者来说,GDB 调试是需要熟练掌握的一项技能
Linux课件:GDB调试简明指南.pdf
linux gdb 调试手册
GDB调试GDB调试GDB调试GDB调试GDB调试 GDB调试GDB调试GDB调试GDB调试GDB调试
关于linux下使用GDB调试的资料 ,非常好。
GDB完全手册,Linux调试工具GDB,入门级使用例子
最新的Gdb安装包,linux版,希望能帮助大家调试好程序!
这是GDB完全手册,用来在Linux环境下的GDB调试,很重要
•file 装入想要调试的可执行文件. •kill 终止正在调试的程序. •list 列出产生执行文件的源代码的一部分. •next 执行一行源代码但不进入函数内部. •step 执行一行源代码而且进入函数内部. •run 执行当前被调试...
linux使用gdb调试方法详解,包含 GDB 命令、在 GDB 里运行程序的例子,如何打断点和继续运行、查看堆栈信息、检查源文件,查看内存信息和各种数据
linux 调试工具gdb-7.2.tar.gz
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。...IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所 谓“寸有所长,尺有所短”就是这个道理。
Linux调试GDB中文手册Linux调试GDB中文手册
主要介绍了Linux下如何使用gdb调试core文件,帮助大家更好的理解和学习Linux,感兴趣的朋友可以了解下
该压缩包是嵌入式linux下移植gdb和gdbserver调试工具源码包,并且最重要里面还有一份移植文档,该文档内容会手把手教你编译安装和使用gdb和gdbserver调试工具