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

原文地址:https://www.cnblogs.com/songyuejie/p/3974542.html