【ACCESS精品源码栏目提醒】:网学会员鉴于大家对ACCESS精品源码十分关注,论文会员在此为大家搜集整理了“使用gdb分析core文件的方法 - 计算机教材”一文,供大家参考学习
使用gdb分析core文件的方法 今天有人问起这个问题于是写了个简单的例子演示一下这个过程。
FreeBSD的开发者手册上对此有专节论述此外也可以参考gdb手册。
编写一个小程序 CODE:Copy to clipboard1 void foovoid 2 3 int 0 1 4 5 6 int mainvoid 7 8 foo 9 命名为foo.c使用-g选项编译它以便能够在core文件中包含调试信息方便gdb跟踪至源代码行 CODE:Copy to clipboardgcc -g foo.c 生成的文件名就是默认的a.out。
运行这个a.out程序显然它会在第三行处产生一个core dump生成a.out.core文件。
我们这时就可以使用下述命令对其进行分析 CODE:Copy to clipboardgdb a.out a.out.core 运行结果如下 CODE:Copy to clipboardgdb a.out a.out.core GNU gdb 6.1.1 FreeBSD Copyright 2004 Free Software Foundation Inc. GDB is free software covered by the GNU General Public License and you are welcome to change it and/or 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. This GDB was configured as i386-marcel-freebsd... Core was generated by a.out. Program terminated with signal 11 Segmentation fault. Reading symbols from /lib/libc.so.6...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /libexec/ld-elf.so.1...done. Loaded symbols for /libexec/ld-elf.so.1 0 foo at foo.c:3 3 int 0 1 gdb 我们可以看到这时gdb已经打印出了程序崩溃原因以及出错的代码行位置。
如果我们想查看出问题之前的调用栈可以使用gdb的bt命令 CODE:Copy to clipboardgdb bt 0 foo at foo.c:3 1 0x080484bd in main at foo.c:8 gdb 我们还可以使用up和down命令在调用栈中移动并检查相应栈内的变量值以便分析复杂程序出错的真实原因。