• 【Z】段错误Segment Fault定位,即core dump文件与gdb定位


     使用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所示。

    wKioL1RtUgegqo2HAAJYCKi5u3o680.jpg

    图1

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

    wKioL1RtUkGTLdz6AAJp9V510AI777.jpg

    图2

        

    二、段错误程序

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

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

    wKioL1RtUwWh4T3JAAFTbrm8PuU480.jpg

    图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.jpg图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所示。

    wKiom1RtU42zZY7WAARpO1hwGAo597.jpg

    图6

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

    wKioL1RtVC_Qz0RGAAd1b_ZMjqA244.jpg

    图7

    参考

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

  • 相关阅读:
    2019年计划书单
    redis 分布式锁实现
    filter-grok,dissect匹配数据
    nohup-长期运行进程
    filter
    kill
    watch
    free
    jar
    tree
  • 原文地址:https://www.cnblogs.com/aoyihuashao/p/9507841.html
Copyright © 2020-2023  润新知