1. Coredump 原理

在Linux系统中,当一个程序发生致命错误或崩溃时,操作系统会生成一个核心转储文件(coredump文件)。这个文件包含了程序在崩溃时的内存映像,包括堆栈跟踪信息、寄存器状态和其他相关数据。生成 coredump 文件的过程如下:

  1. 当程序崩溃时,操作系统会收到一个异常信号,通常是 SIGSEGV(段错误)或SIGABRT(异常终止)。
  2. 操作系统会捕获到这个异常信号,并根据系统配置的设置来确定是否生成 coredump 文件。
  3. 如果生成 coredump 文件的条件满足,操作系统会将程序的内存映像保存到一个文件中,通常命名为“core”或者“core.<进程ID>”。
  4. coredump 文件可以用于后续的调试和分析,可以通过调试器(如gdb)加载这个文件来还原程序崩溃时的状态。

生成 coredump 文件的条件和设置可以通过操作系统的配置进行调整,例如通过ulimit命令设置 core 文件大小的限制或者通过sysctl修改生成coredump文件的路径。

<aside> 🔑 引发程序生成核心转储文件的方式之一是键入退出字符(通常为 Control-\),从而生成 SIGQUIT 信号。

</aside>

coredump 的可能性有哪些?

  1. 内存访问异常
    1. 数组下标导致的访问越界
    2. 字符串不包含 \\0 导致的越界访问
    3. 使用 strcpy strcat 等字符串操作函数,导致目标内存区域错误
  2. 多线程未添加锁保护
  3. 指针相关
    1. 空指针解引用
    2. 非法的指针转化
    3. 在 free 后再次进行 use
    4. 双重 free
  4. 堆栈相关
    1. 栈中的变量过多,导致堆栈溢出
    2. 栈变量的非法写入,导致程序调用栈被破坏而无法回溯

如何启用core dump?

查看core dump文件是否开启:ulimit -a

$ ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         unlimited
-m: resident set size (kbytes)      unlimited
-u: processes                       63518
-n: file descriptors                1024
-l: locked-in-memory size (kbytes)  64
-v: address space (kbytes)          unlimited
-x: file locks                      unlimited
-i: pending signals                 63518
-q: bytes in POSIX msg queues       819200
-e: max nice                        0
-r: max rt priority                 0
-N 15:                              unlimited