加载中…
个人资料
红超的吾记之谈
红超的吾记之谈
  • 博客等级:
  • 博客积分:0
  • 博客访问:8,104
  • 关注人气:176
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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()中被 调用的。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有