段错误Segment Fault定位,即core dump文件与gdb定位

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

 

1、core dump服务器

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

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

查看。使用ulimit -c ulimit -a命令查看core dump文件大小,若是core file size0,则表示此时系统不会自动生成core dump文件,具体状况如图1所示。操作系统

wKioL1RtUgegqo2HAAJYCKi5u3o680.jpg

图1.net

设置。咱们能够经过ulimit-c unlimited命令,将core file size设置为不受限制unlimited,以此配置系统,使之能够自动生成coredump文件,具体操做如图2所示。调试

wKioL1RtUkGTLdz6AAJp9V510AI777.jpg

图2
blog

    

2、段错误程序进程

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

#include<assert.h>
 
int main() {
    assert(0);
    return 0;
}

wKioL1RtUwWh4T3JAAFTbrm8PuU480.jpg

图3

3、core文件命名

在生产环境中,一台服务器上运行的程序较多,若是全部程序的core dump文件都自动命名为core,则可能形成必定的混乱。为此,咱们能够经过设置,使得系统在为core dump文件命名时注明更多信息。

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

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


wKiom1RtUsnBtOR-AALfUI2n0aI075.jpg

图4

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

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

wKioL1RtU4nS6Vo-AANcYWoLp7E883.jpg5

    若是咱们想进一步订制core文件的名称,能够根据表1的信息,进行设置。

表1

%% 单个%字符

%p 进程ID

%u 进程实际用户ID

%g 进程的实际组ID

%s 致使本次core dump的信号

%t core dump的时间戳 (197011日计起的秒数)

%h 主机名

%e 程序文件名


4、使用gdb定位core dump错误

部分博友的博客中提到使用gdb –c corewhere命令定位错误。或许是由于配置不一样,我实际操做后发现若是使用gdb –c core,则得到的定位信息不具备可读性,具体如图6所示。

wKiom1RtU42zZY7WAARpO1hwGAo597.jpg

图6

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

wKioL1RtVC_Qz0RGAAd1b_ZMjqA244.jpg

图7


参考

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

相关文章
相关标签/搜索