使用gdb和core dump迅速定位段错误

转载 2013年10月24日 14:43:00
使用gdb和core dump迅速定位段错误
关键字:gdb、段错误、core dump
 
一、什么是core dump
    core:内存、核心的意思;
    dump:抛出,扔出;
    core dump:前提:当某程序崩溃的一瞬间,内核会抛出当时该程序进程的内存详细情况,存储在一个名叫core.xxx(xxx为一个数字,比如core.699)的文件中。
二、更改生成的core文件的大小限制
    可见,core文件是内核生成的,那某一个进程因为段错误而崩溃的时候的内存映像很大,那必然会生成一个很大的core文件,所以我们可以通过ulimit命令来设置生成core文件的大小,例如$ulimit -c unlimited,这里就是设置生成的core文件无大小限制。
三、生成core文件
    当第二步完成了,就运行一次那个有问题的程序,然后自然就会因为段错误而崩溃,在当前目录下就生成了core.xxx文件。
四、分析core文件
    使用命令$gdb 程序名 core.xxx,然后再输入where就可以看到产生段错误的地方。
五、实例分析
1.test.c文件的源代码
  1 void do_it();
  2 int main()
  3 {
  4         do_it();
  5         return 0;
  6 }
  7 void do_it()
  8 {
  9         char* p = 1; //定义一个字符指针变量a,指向地址1,这个地址肯定不是自己可以访问的,但是这行不会产生段错误
 10         *p = 'a'; //真正产生段错误的在这里,试图更改地址1的值,此时内核会终止该进程,并且把core文件dump出来
 11 }
2.编译该源代码,请注意,加-g标签,可以在where命令后看到更加详细的信息。
    运行编译命令:$gcc -g ./test.c,看到如下打印
[michael@localhost core_dump]$ gcc -g ./test.c 
./test.c: In function ‘do_it’:
./test.c:9:19: warning: initialization makes pointer from integer without a cast
[michael@localhost core_dump]$ 
    从而得到带调试信息的(因为加了-g 编译标签)a.out二进制文件。3.设置core文件大小限制为无限大。    运行命令:$ulimit -c unlimited,即可。4.生成core文件。    运行命令:$./a.out,即可,可看到如下打印:
[michael@localhost core_dump]$ ./a.out 
Segmentation fault (core dumped)
[michael@localhost core_dump]$ 
    运行命令:$ll,可看到如下打印:
[michael@localhost core_dump]$ ll
total 80
-rwxrwxr-x. 1 michael michael   5612 May  2 15:54 a.out
-rw-------. 1 michael michael 204800 May  2 15:58 core.7369
-rw-rw-r--. 1 michael michael    383 May  2 15:53 test.c
[michael@localhost core_dump]$ 
5.使用gdb调试core文件。    运行命令:$gdb ./a.out ./core.7369,可看到如下打印:
[michael@localhost core_dump]$ gdb ./a.out ./core.7369 
GNU gdb (GDB) Fedora (7.2-52.fc14)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/michael/core_dump/a.out...done.
[New Thread 7369]
Missing separate debuginfo for 
Try: yum --disablerepo='*' --enablerepo='*-debuginfo' install /usr/lib/debug/.build-id/c4/1c574f31a203492b9389c783adad6ff1989915
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x080483b8 in do_it () at ./test.c:10
10        *p = 'a'; //真正产生段错误的在这里,试图更改地址1的值,此时内核会终止该进程,并且把core文件dump出来
Missing separate debuginfos, use: debuginfo-install glibc-2.13-2.i686
(gdb) 
    运行命令:where,即可看到出现段错误的行数了,如下打印:
(gdb) where
#0  0x080483b8 in do_it () at ./test.c:10
#1  0x0804839f in main () at ./test.c:4
(gdb) 
    在第10行,很容易吧。

Linux段错误及GDB Coredump调试方法

最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fa...
  • oscarjulia
  • oscarjulia
  • 2017年07月03日 19:16
  • 553

使用 GDB 调试 CoreDump 文件

使用 GDB 调试 CoreDump 文件 28 AUGUST 2011 写C/C++程序经常要直接和内存打交道,一不小心就会造成程序执行时产生Segment Fault而挂掉。一般这种情况都是因...
  • benjmali
  • benjmali
  • 2016年07月12日 11:08
  • 1362

GDB之在线调试与Coredump分析

  • 2015年01月21日 13:26
  • 1.18MB
  • 下载

gdb 调试coredump文件中烂掉的栈帧的方法

gdb调试core文件,直接backtrace,然后查看用frame n切换栈帧。 info local可以查看当前栈的局部变量。对于烂掉的栈帧,可以参考如下文章来推测对应的符号。 http://...
  • imturkey
  • imturkey
  • 2015年08月26日 16:20
  • 1887

gdb调试coredump(原理篇)

上一篇博客里我们通过3个例子介绍了gdb调试coredump的时候,比较常用到的一些命令和定位方法。这篇内容里,我们将尝试去探讨gdb调试coredump的原理,以及它们背后的一些东西。   Co...
  • u014403008
  • u014403008
  • 2017年01月22日 08:46
  • 964

GDB调试core文件样例(如何定位Segment fault)

core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIG...
  • sunboy_2050
  • sunboy_2050
  • 2010年10月16日 12:39
  • 54301

gdb调试coredump(使用篇)

什么是coredump,ulimit,Windows下miniDump和FullDump的设置,gdb 调试coredump的简单示例,生成core文件,自定义core文件的文件名,设置永久保存,gd...
  • u014403008
  • u014403008
  • 2017年01月07日 15:20
  • 3883

GDB调试core文件详解

一,什么是coredump         我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条...
  • u010889616
  • u010889616
  • 2015年09月30日 00:13
  • 11813

GDB如何从Coredump文件恢复动态库信息

在Linux生成Coredump文件时程序并没有对动态链接库文件信息进行特殊处理,但GDB在载入Coredump文件时却能正确加载所有的动态链接库,包括程序运行中调用dlopen动态载入的so文件,其...
  • _xiao
  • _xiao
  • 2014年04月08日 14:29
  • 8666

gdb调试coredump文件,函数名称是问号

原文地址::http://blog.csdn.net/wannew/article/details/17736013 google key: gdb问号 http://blog...
  • xqhrs232
  • xqhrs232
  • 2016年10月19日 00:59
  • 854
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用gdb和core dump迅速定位段错误
举报原因:
原因补充:

(最多只允许输入30个字)