gdb 查看 core 文件
(2009-12-14 16:19:19)
标签:
gdb查看core文件杂谈 |
分类: *C/CPlusPlus |
(转载 FreeBSD开发手册 2.6.3 检查 core
文件:http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/developers-handbook/book.html#DEBUGGING)
基本上 core 文件就是一个包含了程序崩溃时这个进程的所有信息的文件。在那 “遥远的黄金年代”,程序员不得不把 core
文件以十六进制的方式显示 出来,然后满头大汗的阅读机器码的手册,但是现在事情就简单得多了。顺便说一下, 在 FreeBSD 和其他的
4.4BSD 系统下,core 文件都叫作 progname.core 而不是简单叫
core,这样可以很清楚的表示出这个 core 文件是属于哪个 程序。
1. 要检查一个 core 文件,首先用 gdb 可执行文件名 来调试产生core文件的可执行程序:
2. 命令 core会分析 可执行程序名.core
文件
注:如果当前不是 core 文件所在目录,首先要执行 dir
/可执行程序名.core的路径/。
(gdb)core
可执行程序名.core
举例:
$gdb
a.out
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the
conditions. There is absolutely no warranty for GDB; type "show
warranty" for details. GDB 4.13 (i386-unknown-freebsd), Copyright
1994 Free Software Foundation, Inc.
(gdb)core a.out.core
Core was generated by `a.out'.
Program terminated with signal 11, Segmentation fault.
Cannot access memory at address 0x7020796d.
#0 0x164a in bazz (anint=0x5) at temp.c:17
(gdb)
这种情况下,运行的程序叫 a.out,因此 core 文件 就叫
a.out.core。我们知道程序崩溃的原因就是函数 bazz
试图访问一块不属于它的内存。
有时候,能知道一个函数是怎么被调用的是非常有用处的。因为在一个复杂的
程序里面问题可能会发生在函数调用栈上面很远的地方。
3. 命令 bt 会让 gdb 输出函数调用栈的回溯追踪
(gdb)bt
#0 0x164a in bazz (anint=0x5) at temp.c:17
#1 0xefbfd888 in end ()
#2 0x162c in main () at temp.c:11
(gdb)
函数 end()
在一个程序崩溃的时候将被调用;
在本例 中,函数 bazz()
是从
main()
中被
调用的。