coredump

coredump

简单来说,core dump说的是操作系统执行的一个动作,当某个进程因为一些原因意外终止(crash)的时候,操作系统会将这个进程当时的内存信息转储(dump)到磁盘上1。产生的文件就是core文件了,一般会以core.xxx形式命名。

 

如何产生Core Dump

一般来说, 当进程接收到某个信号导致进程退出或crash(崩溃)的时候, 会产生一个 core dump 文件.

比如经常遇到的数组越界或者访问空指针都会产生一个SIGSEGV型号, 导致程序崩溃, 这个时候就会产生一个core dump.

以下是默认产生 coredump 的一些信号.

3)SIGQUIT   4)SIGILL   6)SIGABRT   8)SIGFPE    11)SIGSEGV    7)SIGBUS   31)SIGSYS

5)SIGTRAP   24)SIGXCPU 25)SIGXFSZ  29)SIGIOT

需要注意的是当程序自己接管了信号处理后不会产生core dump了.

 

Core Dump 设置

以上只是产生coredump的必要条件,而非充分条件。要产生core文件还依赖于程序运行的shell,可以通过ulimit -c命令查看core file size设置. 这个值用来限制产生的 core 文件大小, 超过这个值就不会保存了. 如果设置为0,就是不会保存core文件. 即使产生了, 也不会保存. 可以使用 ulimit-c unlimited 将core dump打开.

 

默认情况下,产生的 core dump 文件名为 core. 可以通过设置内核参数

/proc/sys/kernel/core_pattern设置产生 core 文件的模板.

以下是参数列表:

    %p - 文件名添加pid

    %u - 文件名添加当前uid

    %g - 文件名添加当前gid

    %s - 文件名添加导致产生core的信号

    %t - 文件名添加core文件生成时的unix时间

    %h - 文件名添加主机名

    %e - 文件名添加执行文件名

 

如果  /proc/sys/kernel/core_pattern 模板不包含 "%p" 且

       /proc/sys/kernel/core_uses_pid 为非0, 则当前 pid 将添加到 core 文件命.


gdb 调试 core dump

创建一个空指针的crash.c

int crash(void *in)

{

    uint8_t *ptr = NULL;

    *ptr = 0x1;

    return 0;

}

 

int main(int argc,char **argv)

{

    crash(NULL);

    return 0;

}

~

 

root@ubuntu:/work/Code#gcc -g crash.c  -o crash

gcc -g 参数很重要, 可以产生调试 symbol直接定位错误文件, 函数,代码行.

root@ubuntu:/work/Code#./crash

Segmentationfault (core dumped)

产生core dump 文件.

root@ubuntu:/work/Code#gdb crash  core

Readingsymbols from /work/Code/crash...done.

[New Thread2294]

warning: Can'tread pathname for load map: Input/output error.

Readingsymbols from /lib/libc.so.6...(no debugging symbols found)...done.

Loaded symbolsfor /lib/libc.so.6

Readingsymbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.

Loaded symbolsfor /lib64/ld-linux-x86-64.so.2

Core wasgenerated by `./crash'.

Programterminated with signal 11, Segmentation fault.

#0  0x00000000004004d8 in crash (in=0x0) atcrash.c:14

14              *ptr = 0x1;

(gdb)

此刻已马上定位到crash.c 14 行.

也调用 gdbwhere/backtrace 查看当前的函数调用栈的所有信息.

(gdb) where

#0  0x00000000004004d8 in crash (in=0x0) atcrash.c:14

#1  0x00000000004004fb in main (argc=1,argv=0x7fffdb7f6998) at crash.c:20

(gdb)backtrace

#0  0x00000000004004d8 in crash (in=0x0) atcrash.c:14

#1  0x00000000004004fb in main (argc=1,argv=0x7fffdb7f6998) at crash.c:20

(gdb)

 

 

(gdb) thread apply[thread no]/[all] command 可调试多线程 .

(gdb) thread applyall bt

显示所有线程的调用栈信息

 

可以参考系统core详细说明 :

man core

<think>我们正在讨论coredump,即程序崩溃时操作系统生成的内存转储文件。它记录了程序崩溃时的内存状态,是调试的重要工具。 用户要求回答后必须提出3-5个相关问题,并以“§§相关问题§§”开头,问题用数字列表形式。 回答要点: 1. 解释coredump是什么,有什么作用。 2. 如何生成coredump(系统设置)。 3. 如何分析coredump(使用gdb等工具)。 4. 注意事项(如文件大小、路径设置等)。 由于要求500字左右,我们详细展开。 注意:用通俗易懂的语言,避免过于技术化。</think>### Coredump 分析与应用指南 Coredump(核心转储)是程序崩溃时操作系统自动生成的内存快照文件,相当于程序"临终遗言"。它完整保存了崩溃瞬间的堆栈、寄存器、内存数据等关键信息,是定位疑难崩溃问题的终极武器。 **核心价值与应用场景** 1. **死后验尸** - 当程序突然崩溃且无日志时,coredump 能还原案发现场 2. **复杂问题定位** - 解决内存泄漏、多线程竞争等仅靠日志难以捕捉的问题 3. **生产环境诊断** - 无需复现故障,直接分析线上生成的转储文件 **关键操作步骤** ```bash # 1. 启用系统coredump(Linux示例) ulimit -c unlimited echo "/tmp/core-%e-%p" > /proc/sys/kernel/core_pattern # 2. 触发崩溃后分析(使用GDB) gdb /path/to/program /tmp/core.1234 (gdb) bt full # 查看完整堆栈 (gdb) info registers # 检查寄存器状态 (gdb) x/100x 0x7ffd1234 # 查看指定内存区域 ``` **三大实战技巧** 1. **瘦身策略** - 限制大小:`ulimit -c 102400`(100MB) - 选择性保存:通过`gcore`命令手动截取关键进程 2. **增强可读性** - 编译时保留符号:`gcc -g -O0` - 使用`addr2line`工具将地址转源码位置 3. **自动化分析** - 结合崩溃收集系统(如breakpad) - 编写脚本自动解析堆栈关键帧 **注意事项** - 安全风险:coredump可能包含敏感数据,传输需加密 - 版本匹配:分析环境需与崩溃程序版本一致 - 嵌入式场景:资源受限设备需定制精简coredump方案 通过系统化分析coredump,开发人员可将平均故障修复时间缩短70%。最重要的是建立持续收集机制,让每个崩溃都转化为改进机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值