• Linux 下段错误 core文件


    什么是core dump?

    core的意思是内存,dump的意思是扔出来,堆出来;当一个程序奔溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core文件仅仅是一个内存映像(同时加上调试信息),主要用来调试的。

    为什么没有core文件生成呢?

    有时候程序down了,但是core文件却没有生成.core文件的生成跟你当前系统的环境设置有关系,可以用下面的语句设置一下便生成core文件了

    linux平台下,设置core dump文件生成的方法:
    1. 在终端中输入ulimit -c 如果结果为0,说明当程序崩溃时,系统并不能生成core dump。
    2. 使用ulimit -c unlimited命令,开启core dump功能,并且不限制生成core dump文件的大小。如果需要限制,加数字限制即可。ulimit - c 1024
    3. 默认情况下,core dump生成的文件名为core,而且就在程序当前目录下。新的core会覆盖已存在的core。通过修改/proc/sys/kernel/core_uses_pid文件,可以将进程的pid作为作为扩展名,生成的core文件格式为core.xxx,其中xxx即为pid
    4. 通过修改/proc/sys/kernel/core_pattern可以控制core文件保存位置和文件格式。例如:将所有的core文件生成到/corefile目录下,文件名的格式为core-命令名-pid-时间戳. echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

    段错误是什么

    段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。

    段错误产生的原因 

    1.访问不存在的内存地址

    2.访问系统保护的内存地址

    3.访问只读的内存地址

    4.栈溢出

    ......

    查看段错误的发生信息

    1.dmesg

    段错误的调试方法

    1.使用printf输出信息

    在程序的重要代码附近加上像printf这类输出信息,这样可以跟踪并打印出段错误在代码中可能出现的位置。

    为了方便使用这种方法,可以使用条件编译指令#ifdef DEBUG和#endif把printf函数包起来。这样在程序编译时,如果加上-DDEBUG参数就能查看调试信息;否则不加该参数就不会显示调试信息。

    2.使用gcc和gdb 

    为了能够使用gdb调试程序,在编译阶段加上-g参数

    ./gcc helloworld.c -o  -g  helloworld

    使用gdb命令调试程序

    gdb ./helloworld

    进入gdb后,运行程序:

    run

    从输出看出,收到SIGSEGV信号,触发段错误,并提示

    完成调试后,输入quit命令退出gdb

    quit

    可以借助于程序异常退出时生成的core文件中的调试信息,使用gdb工具来调试程序中的段错误。

    gdb ./helloworld ./core

    从输出看到段错误信息

    完成调试后,输入quit命令退出gdb:

    quit

  • 相关阅读:
    搭建MHA问题汇总
    NOIP2009 靶形数独
    get_mysql_conn_info.py
    NOIP 2005 篝火晚会
    MySQL启动关闭添加到 /etc/init.d/mysqld
    noip2002 矩形覆盖
    get_slave_status.py
    [JSOI2008]魔兽地图
    MySQL数据导出导入任务脚本
    8.30 牛客OI赛制测试赛1 F题 子序列
  • 原文地址:https://www.cnblogs.com/songyuejie/p/3974542.html
Copyright © 2020-2023  润新知