使用C++开发系统有时会出现段错误,即Segment Fault。此类错误程序直接崩溃,通常没有任何有用信息输出,很难定位bug,因而无从解决问题。今天我们介绍core dump文件,并使用gdb进行调试,以此来定位段错误问题。此文同时用以备忘。

一、core dump

Core dump也称核心转储, 当程序运行过程中异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 称之为core dump文件。

系统默认不生成core dump文件,可以使用ulimit命令进行查看和设置。

查看。使用ulimit -c 或 ulimit -a命令查看core dump文件大小,如果core file size为0,则表示此时系统不会自动生成core dump文件,具体情况如图1所示。

图1

设置。我们可以通过ulimit-c unlimited命令,将core file size设置为不受限制unlimited,以此配置系统,使之可以自动生成coredump文件,具体操作如图2所示。

图2

二、段错误程序

我们编写一段简单的段错误程序,将之命名为core_test.cpp,代码如下。编译运行,系统自动产生了core文件,如图3所示。

#include<assert.h>

int main() {
assert(0);
return 0;
}
 

图3

三、core文件命名

在生产环境中,一台服务器上运行的程序较多,如果所有程序的core dump文件都自动命名为core,则可能造成一定的混乱。为此,我们可以通过设置,使得系统在为core dump文件命名时注明更多信息。

进程号。通过以下设置,可以使core dump文件名为core.pid形式。如图4所示,系统自动生成了core.3430文件。

echo "1" >/proc/sys/kernel/core_uses_pid
 

图4

更多信息。通过以下设置,可以使core dump文件名为core-exe-pid-time形式。如图4所示,系统自动生成了core-core_test-3465-1416037828文件。

echo “/coredir/core-%e-%p-%t” > /proc/sys/kernel/core_pattern/
 

图5

如果我们想进一步订制core文件的名称,可以根据表1的信息,进行设置。

表1

%% 单个%字符

%p 进程ID

%u 进程实际用户ID

%g 进程的实际组ID

%s 导致本次core dump的信号

%t core dump的时间戳 (由1970年1月1日计起的秒数)

%h 主机名

%e 程序文件名

四、使用gdb定位core dump错误

部分博友的博客中提到使用gdb –c core与where命令定位错误。或许是因为配置不同,我实际操作后发现如果使用gdb –c core,则获得的定位信息不具有可读性,具体如图6所示。

图6

最终,我使用gdb core_test core命令(其中core_test是发生dump的可执行程序,core是core file),进入gdb后,再使用where命令,可以定位到发生dump的代码位置,并且具有良好的可读性,具体如图7所示。

图7

参考

http://blog.csdn.net/ithomer/article/details/5945152

【Z】段错误Segment Fault定位,即core dump文件与gdb定位的更多相关文章

  1. Segment fault及LINUX core dump详解 (zz)

    C 程序在进行中发生segment fault(core dump)错误,通常与内存操作不当有关,主要有以下几种情况: (1)数组越界. (2)修改了只读内存. (3)scanf("%d&q ...

  2. Segment fault及LINUX core dump详解

    源自:http://andyniu.iteye.com/blog/1965571 core dump的概念: A core dump is the recorded state of the work ...

  3. 利用linux信号机制调试段错误(Segment fault)

    在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...

  4. 利用linux信号机制调试段错误(Segment fault)【转】

    转自:http://blog.csdn.net/ab198604/article/details/6164517 版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际开发过程中,大家可能会遇到 ...

  5. 造成segment fault,产生core dump的可能原因

    1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符 c) 使用strcpy, strcat, spr ...

  6. Linux下如何生成core dump 文件(解决segment fault段错误的问题)

    Linux下的C程序常常会因为内存访问等原因造成segment fault(段错误),如果此时core dump 的功能是打开的,在运行我们的可执行程序时就会生成一个名为core的文件,然后我们就可以 ...

  7. linux core dump 文件 gdb分析

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

  8. 用gdb调试程序笔记: 以段错误(Segmental fault)为例

    用gdb调试程序笔记: 以段错误(Segmental fault)为例[转] 1.背景介绍2.程序中常见的bug分类3.程序调试器(如gdb)有什么用4.段错误(Segmental fault)介绍5 ...

  9. linux C++ 莫名奇异的段错误(segmentation fault),无法调用其他函数

    进来在linux下开发C++项目,遇到了非常奇怪的bug. 项目须要多线程实现,在写好代码后,每当执行到线程函数内部,当内部调用其他函数如printf.fopen等时就会提示段错误(segmentat ...

随机推荐

  1. 【随笔】win7下安装Apache服务器

    1.首先下载64位的apache服务器httpd-2.4.10-win64.zip 2.解压,可以是默认路径,也可以自定义路径,我这里是E:/ 3.打开E:/Apache24/conf文件夹 4.随便 ...

  2. 从C语言的整数取值范围说开去

    在ILP32中, char, short, int, long, long long, pointer分别占1, 2, 4, 4, 8, 4个字节,在 LP64中, char, short, int, ...

  3. 想熟悉PostgreSQL?这篇就够了

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由angel_郁 发表于云+社区专栏 什么是PostgreSQL? PostgreSQL是自由的对象-关系型数据库服务器,在灵活的BSD ...

  4. Python基础(3) - 数据类型:1数字类型

    Python数据类型 数据类型 是否容器 是否可变 存储方式 数字 否 否 直接 字符串 否 否 直接 列表 是 是 顺序 元组 是 否 顺序 字典 是 是 映射 数字类型 整  型:1,234,0, ...

  5. 使用webpack2.0 搭建react.js项目

    最近一段时间没有写react.js,发现webpack已经完全升级为2.0了,升级后导致以前的项目不能正常编译,只能重新实践一番 关于webpack2.0和1.x的区别概括起来就是tree shaki ...

  6. 深入理解JavaScript系列(45):代码复用模式(避免篇)

    介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量 ...

  7. Redis 小结

    一.redis简介 redis是一款基于C语言编写的,开源的非关系型数据库,由于其卓越的数据处理机制(按照规则,将常用的部分数据放置缓存,其余数据序列化到硬盘),大家也通常将其当做缓存服务器来使用. ...

  8. win8及以上2012 R2,virtualbox 5.0.20安装centOS6以上各种注意事项

    问题: Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso 1.先下载适合win8及2012 R2以上系统适用的virtualbox最新版5.0.20 ...

  9. 在 Azure 上创建和链接 MySQL 数据库

    本快速入门介绍了如何使用 Azure 门户创建并连接 MySQL 数据库.在本教程中完成的所有操作均符合 1 元试用条件. 开始之前如果您还没有 Azure 账户,可以申请 1 元试用账户 步骤1:创 ...

  10. js 表格合并单元格

    5列  根据需要可添加 或 删除 strOneTemp  strTwoTemp  strThreeTemp  strFourTemp  strFiveTemp //合并单元格  this.mergeC ...