zoukankan      html  css  js  c++  java
  • linux下Segmentation Fault生成coredump文件进行gdb调试

     

    1、在linux下运行程序出现段错误,如果程序不是很大还比较好找,但是如果程序很大,会比较难以定位;在linux下可以支持生成coredump文件,使用gdb来解析Segmentation Fault时发生了什么,可以比较方便的查看程序崩溃的位置;

    2、一般linux系统都是默认关闭coredump文件生成,需要执行命令打开;实际上就是配置生成coredump的文件大小,系统默认为0,即不产生coredump文件;

    ulimit -c unlimited

    3、编译源代码时makefile编译选项添加 [-g] 选项,如果有 [-O] 选项,则设置为"-O0",即不进行优化;

    4、正常运行软件,在软件出现段错误时,会在软件运行目录下生成core文件或者core.***文件;

    5、使用gdb解析,使用时注意test_app的路径;

    gdb test_app core

    进入gdb交互界面之后,输入bt,即backtrace,查看调用栈,比如

    可以看到#0附近在test.c的第7行出错,可以使用frame 0或者frame 1等等方便的查看使用的代码,这里可以看到是一个赋值语句导致段错误;也可以使用bt full命令查看所有调用栈的变量值或symbol等信息,具体的可以查看gdb调试命令说明;

    6、使用gdb调试coredump时的调用栈信息不一定都能非常准确的指出错误的位置,需要去进行分析;比如提示到某个标准库的接口错误,那么应该去查一下调用传参是否正确;

    7、可以通过修改/proc/sys/kernel/core_uses_pid来决定是否添加pid扩展名

    0为默认值,即不添加,修改为1即添加:echo 1 > /proc/sys/kernel/core_uses_pid

    8、可以通过修改/proc/sys/kernel/core_pattern来决定生成core文件的位置和格式

    可通过以下命令修改此文件:
    echo "/tmp/core-%p-%t" > core_pattern,可以将core文件统一生成到/tmp目录下,产生的文件名为core-pid-时间戳
    参数列表:
        %p - insert pid into filename 添加pid
        %u - insert current uid into filename 添加当前uid
        %g - insert current gid into filename 添加当前gid
        %s - insert signal that caused the coredump into the filename 添加导致产生core的信号
        %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
        %h - insert hostname where the coredump happened into filename 添加主机名
        %e - insert coredumping executable name into filename 添加命令名

  • 相关阅读:
    .NET实现Excel文件的读写 未测试
    权限管理设计
    struts1中配置应用
    POJ 2139 Six Degrees of Cowvin Bacon(floyd)
    POJ 1751 Highways
    POJ 1698 Alice's Chance
    POJ 1018 Communication System
    POJ 1050 To the Max
    POJ 1002 4873279
    POJ 3084 Panic Room
  • 原文地址:https://www.cnblogs.com/bonelee/p/13702385.html
Copyright © 2011-2022 走看看