使用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文件的源代码

void do_it();
int main()
{
do_it();
return 0;
}
void do_it()
{
char* p = 1; //定义一个字符指针变量a,指向地址1,这个地址肯定不是自己可以访问的,但是这行不会产生段错误
*p = 'a'; //真正产生段错误的在这里,试图更改地址1的值,此时内核会终止该进程,并且把core文件dump出来
}

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行,很容易吧。

GDB调试core文件(2)的更多相关文章

  1. Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件

    交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gd ...

  2. 解决gdb 调试 core 文件函数名显示为问号的问题

    关于gdb调试core文件总是一堆问号的问题 问题描写叙述:已经在编译选项中增加了-g,可是查看core文件时.还是一堆问号,使用的命令为:gdb -c core 解决方式:因为gdb -c core ...

  3. GDB调试core文件(3)

    列出一些常见问题: 一,如何使用core文件 使用core文件 在core文件所在目录下键入: gdb -c core 它会启动GNU的调试器,来调试core文件,并且会显示生成此core文件的程序名 ...

  4. gd调试命令,gdb调试core文件

    使用 gcc -g test.c -o test.out 编译程序,只有加-g参数才支持gdb调试: 然后 gdb ./test.out 运行可执行文件,进入gdb调试模式(gdb),在括号后面的输入 ...

  5. 【Linux】gdb调试core文件

    编写服务器端程序,很容易遇到Crash问题,比较幸运的是Linux提供了core file,保留了Crash的现场.有时候,根据当前的调用栈,并且打印出当前栈的变量就可以分析出crash的原因,但是, ...

  6. gdb调试core文件

    本人最近正在学习调试技术,此处对栈溢出做一些总结. gdb的基本使用就不多扯了. 主要针对发行在外的release版本的软件出现问题时的调试. 一般来讲,查看堆栈就是使用bt,这个时候加上bt ful ...

  7. gdb 调试core文件报错: in free () from /lib64/libc.so.6 找不到原因啊

    运行程序死掉  找不到原因啊..gdb 跟踪与堆栈信息 贴出来了 麻烦大佬们看一下,给个回复,不胜感激!! Core was generated by `./scene_s0037 10037'.Pr ...

  8. gdb 调试coredump文件过程

    gdb 调试coredump文件过程: 第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到 ...

  9. gdb 调试coredump文件过程:

    第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到进程的pid 2.gdb -p pid ...

随机推荐

  1. 通过UltraISO来提取U盘启动盘的ISO镜像文件

    我们先来说下UltraISO这个工具,中文名也叫软碟通,他是一个无需量产你的U盘就可以把U盘做成启动盘的工具,当然了,这么强大的工具肯定不是免费版的,对,他是共享的:但是你可以下载特别版嘛..网上到处 ...

  2. 【前端阅读】——《程序员思维修炼》摘记&读后感&思维导图

    前言:这是一本介绍如何用脑的书,并从思维的角度(以程序员为例),介绍如何从新手成为专家.作者带领着读者(我)共同经历一次有关认知科学.神经学.学习和行为理论的旅程,探索人类大脑令人 惊奇的工作的机制, ...

  3. Mysql 性能监控及调优

    死锁概念: 两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象 1.监控死锁(innotop): (1) 启用 innodb_status_file 在/etc/my.cnf添加如 ...

  4. ANT安装及配置

    首先,到http://ant.apache.org/找到合适的版本下载. 其次,讲下载的zip包解压,得到的目录拷贝到硬盘,如C:\apache-ant-1.9.4 其三,设置环境变量 ANT_HOM ...

  5. Command terminated by signal 11

    Command terminated by signal 11可能的情况之中的一个是数组越界.你在訪问不被同意的内存空间.

  6. vue2 axios 接口函数封装

    封装 axios 工具,编辑 src/api/index.js 文件 首先,我们要使用 axios 工具,就必须先安装 axios 工具.执行下面的命令进行安装 npm install axios - ...

  7. dynamic_cast<const ObjectList&>(msg);

    说简单的就是C里面的强制类型转换,只不过C++里面为了类型安全而这么做的.主要用于 基类与继承类之间. C写多了,类型一般都强转,特别是指针.int * a;void * b = (void*)a;c ...

  8. 1M网速等于多少K

    http://zhidao.baidu.com/question/157400316.html&__bd_tkn__=65ac453b343794385019e962bfb06bb8c710d ...

  9. 摄像机Rtsp地址格式大全

    各厂家rtsp地址格式如下:  一. 海康.中威摄像机 格式1 主码流:rtsp://admin:12345@192.168.1.64:554/Streaming/Channels/1 子码流:rts ...

  10. VueJS计算属性: computed

    computed属性 HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...