(本节笔记的实验代码在这里:)
1. 定义:核心转存,当程序运行过程中发生异常时,Linux把程序出错时的内存内容存储在一个Core文件中。
2. 处理对象:Segment fault(段错误)3. 产生原因:数组访问越界、访问空指针、栈溢出、修改只读内存等
4. 用法:先打开ulimit -c unlimited 这个选项如果打开了,就有可能产生大量的文件,因此默认状态下是关闭的
想要关闭,就 ulimit -c 0
在发生Coredump后,用gdb进行查看,如:gdb ./test test.core 这里的test是程序名,test.core是产生出来的Core文件。不过这个test程序必须加[-g]选项进行编译,否则无法通过gdb进行调试。
用法举例:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char ** argv)
{
char *ptr = "123456"; /* 字符串常亮 */
ptr[0] = '3'; /* 不能修改第一个字符的值,这里会产生段错误 */
return 0;
}
gcc -g test_1.c -o test_1
./test_1
Segment fault (core dump)
gdb ./test_1 core.12566
显示错误的信息为:
#0 0x0804083a4 in main() at test_1.c : 8
8 ptr[0] = '3';
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char ** argv)
{
int *ptr = NULL;
*ptr = 0; /* 不能把0赋值给空指针,这里会产生段错误 */
return 0;
}
gcc -g test_2.c -o test_2
./test_2
Segment fault (core dump)
gdb ./test_2 core.12592
显示错误的信息为:
#0 0x0804083a4 in main() at test_2.c : 8
8 *ptr = 0;