免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11769 | 回复: 8
打印 上一主题 下一主题

使用gdb分析core文件的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-12 16:47 |只看该作者 |倒序浏览
今天有人问起这个问题,于是写了个简单的例子,演示一下这个过程。FreeBSD的开发者手册上对此有专节论述,此外也可以参考gdb手册。

编写一个小程序:
  1. 1   void foo(void)
  2. 2   {
  3. 3       *(int *)0 = 1;
  4. 4   }
  5. 5   
  6. 6   int main(void)
  7. 7   {
  8. 8       foo();
  9. 9   }
复制代码

命名为foo.c,使用-g选项编译它,以便能够在core文件中包含调试信息,方便gdb跟踪至源代码行:
  1. gcc -g foo.c
复制代码

生成的文件名就是默认的a.out。

运行这个a.out程序,显然,它会在第三行处产生一个core dump,生成a.out.core文件。

我们这时就可以使用下述命令对其进行分析:
  1. gdb a.out a.out.core
复制代码

运行结果如下:
  1. [~]$gdb a.out a.out.core
  2. GNU gdb 6.1.1 [FreeBSD]
  3. Copyright 2004 Free Software Foundation, Inc.
  4. GDB is free software, covered by the GNU General Public License, and you are
  5. welcome to change it and/or distribute copies of it under certain conditions.
  6. Type "show copying" to see the conditions.
  7. There is absolutely no warranty for GDB.  Type "show warranty" for details.
  8. This GDB was configured as "i386-marcel-freebsd"...
  9. Core was generated by `a.out'.
  10. Program terminated with signal 11, Segmentation fault.
  11. Reading symbols from /lib/libc.so.6...done.
  12. Loaded symbols for /lib/libc.so.6
  13. Reading symbols from /libexec/ld-elf.so.1...done.
  14. Loaded symbols for /libexec/ld-elf.so.1
  15. #0  foo () at foo.c:3
  16. 3           *(int *)0 = 1;
  17. (gdb)
复制代码

我们可以看到,这时gdb已经打印出了程序崩溃原因,以及出错的代码行位置。

如果我们想查看出问题之前的调用栈,可以使用gdb的bt命令:
  1. (gdb) bt
  2. #0  foo () at foo.c:3
  3. #1  0x080484bd in main () at foo.c:8
  4. (gdb)
复制代码


我们还可以使用up和down命令在调用栈中移动,并检查相应栈内的变量值,以便分析(复杂)程序出错的真实原因。

[ 本帖最后由 雨丝风片 于 2006-5-12 17:00 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-05-12 16:56 |只看该作者
3x first


  1. gdb -g foo.c
复制代码

应该是

  1. gcc -g foo.c
复制代码

??

论坛徽章:
0
3 [报告]
发表于 2006-05-12 17:02 |只看该作者
原帖由 ljoolj 于 2006-5-12 16:56 发表
3x first
gdb -g foo.c
应该是
gcc -g foo.c

??


为了写这个例子,一直在琢磨gdb,倒是把gcc忽略了。。。

论坛徽章:
1
寅虎
日期:2013-09-29 23:15:15
4 [报告]
发表于 2006-05-12 17:16 |只看该作者
^_^

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
5 [报告]
发表于 2006-05-12 17:39 |只看该作者
有时间最好组织下把<Debugging kernel problems>翻译过来。
调试可是认识内核的很好的一种方法阿。(不过它讲的需要两个机器才能使用gdb,否则只能用db,不能关联源代码,很讨厌)

论坛徽章:
0
6 [报告]
发表于 2006-05-12 17:47 |只看该作者
原帖由 gvim 于 2006-5-12 17:39 发表
有时间最好组织下把<Debugging kernel problems>翻译过来。
调试可是认识内核的很好的一种方法阿。(不过它讲的需要两个机器才能使用gdb,否则只能用db,不能关联源代码,很讨厌)


调试手段本身的研究与学习确实非常重要,可以找个适当的时机把这篇资料翻译一下。更重要的是,我们得通过自己的实践得出一些确实可行内核调试方法,写出一些具有指导意义的文章,在这里介绍给大家。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
7 [报告]
发表于 2006-05-12 22:05 |只看该作者
我翻译原教程第5部分吧!
尽管放心的教给我!

论坛徽章:
0
8 [报告]
发表于 2006-05-13 08:06 |只看该作者
原帖由 gvim 于 2006-5-12 22:05 发表
我翻译原教程第5部分吧!
尽管放心的教给我!


果然够主动,第5部分全部原文在此:
5
Reading Code
This section still needs to be written. It will be demonstrated.


组织上相信你能把作者想写而有没写的东西给翻译出来,请不要辜负大家对你的放心,

论坛徽章:
0
9 [报告]
发表于 2010-09-19 08:49 |只看该作者
这个帖子有用,要顶! 好多网站都转载了呢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP