什么是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