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

使用gdb和core dump迅速定位段错误相关推荐

  1. linux c 用户态 调试追踪函数 调用堆栈 定位段错误

    一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc ...

  2. 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类: 嵌入式(928)  一般察看函数运行时堆栈的 ...

  3. 程序退出前的遗言----linux下利用backtrace追踪函数调用堆栈以及定位段错误

    一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc ...

  4. 嵌入式linux应用程序崩溃,嵌入式Linux gdb core dump快速定位程序crash问题

    指定生成 core dump 文件: echo "/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern ulimit -c ...

  5. GDB调试之定位段错误

    其余相关内容可参考个人博客 程序添加打印日志 走查代码,逐步添加printf打印,逐步定位,该方法最简单,且在开发调试过程中也较为快捷有效 GDB调试程序 编译时加入-g参数,使用gdb调试运行程序, ...

  6. 网元查看一个无厘头的core dump问题定位

    查了好多资料,发明还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 明天收到试测部门提的一个bug,bug的容内如下: 每日一道理 爱心是一片照射在冬日的阳光, ...

  7. 用gdb调试core dump文件

    gdb基本的使用方法在此就不说了. 载入core文件的命令行为: dgb exe core 例如 gdb ./testall ./core.2345 最重要的一个命令是where,这个就像windbg ...

  8. Linux下利用backtrace追踪函数调用堆栈以及定位段错误【转】

    转自:https://www.linuxidc.com/Linux/2012-11/73470p2.htm 通常情况系,程序发生段错误时系统会发送SIGSEGV信号给程序,缺省处理是退出函数.我们可以 ...

  9. gdb调试常用命令速查(段错误调试)

    编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o main gdb中命令: 回车键:重复上一命令 (gdb)help:查看命令帮助,具体命令查询在gdb中输入help ...

最新文章

  1. 山寨动力第一篇:明明白白给MK808山寨电视棒安装PicUntu Linux
  2. java基础面向对象_Java基础面向对象
  3. python字符串截取及Html解析
  4. 主表如何统计在附表中的出现次数?
  5. 如何找出SAP Fiori launchpad URL start_up请求发起的具体位置
  6. 前端学习(3201):react插件
  7. BootStrap table 传递搜索参数
  8. 如何使用PL/SQL Developer查看和杀掉session
  9. android classloader双亲托付模式
  10. hp服务器系统如何用u盘恢复,软硬件技巧 篇三:HP战66之恢复U盘制作,以及恢复系统之体验感想...
  11. 印象笔记中可以使用html语言吗,印象笔记支持markdown啦
  12. 运放放大倍数计算公式_运算放大器基础知识
  13. SQL 考勤打卡问题
  14. Arduino案例实操 -- OLED中文显示(IIC)
  15. Android 自定义锁屏_开发自定义ROM提速:红米Note 6 Pro等Android Pie内核源代码上线...
  16. 中国都市女性抗衰洞察:Z世代抗衰意识普遍觉醒,“纹”题成抗衰重点
  17. 2、mysql基本操作中
  18. 华中科技大学计算机复试答案,华中科技大学计算机复试题目
  19. java io导出excel表格_Java IO 导入导出Excel表格
  20. 灾难恢复_有效的灾难恢复计划的10个技巧

热门文章

  1. java string == 比较,Java 基础 之 String 的比较
  2. github 部署mysql_GitHub - luckman666/deploy_mysql_cluster: 一键部署mysql集群
  3. mysql 表锁的概念_MySQL 锁的一些简单概念
  4. python打印当前文件的绝对路径,并解决打印为空
  5. FATE框架安装后测试报错:ModuleNotFoundError: No module named ‘arch‘
  6. cx是什么简称_80年的5角,在纸币收藏界简称为8005
  7. java 只有日期的类_【你不知道的事系列】Java中处理日期的类
  8. 从零开始学习springBoot(Contextpath+修改默认idk)
  9. UINavigationBar的系统渲染方式
  10. 【Android 初学】3、控件布局初步