查看core dump段错误原因

什么是core dump

当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做core dump-核心转储。进程异常终止时因为有BUG,比如非法访问内存导致段错误。事后可以用调试器检查core文件以查清错误原因,这叫做事后调试。
一个进程允许产生多大的core文件,取决于进程的Resource Limit。默认是不允许产生core文件的。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。

如何查看段错误

ulimit -a
命令可以查看当前系统允许产生的core文件大小,一般在第一行为0.
ulimit -c 1024
将core文件允许大小改为1kB。
gcc -g xx.c -o xx
将需要调试的程序加入-g调试信息重新编译
./xx
运行xx程序,依旧是段错误,不过这次生成了一个core文件在当前目录下。
gdb ./xx core.2134
gdb调试一下可执行文件,会发现有提示程序在哪一行终止,并且终止信号是多少。

为什么系统会默认的限制core文件大小?

一般的线上服务器上都有自重启进程的进程,负责把挂掉的进程重新提起来,若是这时产生过大的core文件会把服务器写满产生意想不到的麻烦。

产生core dump的原因

  1. 内存访问越界
    a) 由于使用错误的下标,导致数组访问越界。
    b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。
    c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,将目标字符串读/写爆。
  2. 多线程程序使用了线程不安全的函数。
    多线程读写的数据未加锁保护。
    对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成coredump
  3. 非法指针
    a) 使用空指针
    b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump。
  4. 堆栈溢出
    不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

你可能感兴趣的:(linux)