Linux CORE Dump解析

本文详细介绍了如何在Linux环境下设置coredump,以便在程序非正常崩溃时生成core文件,并演示了如何查看和解析这些核心文件。核心内容包括ulimit命令的使用,core文件大小限制及开启关闭方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux下编译程序的非正常崩溃提示为“CORE DUMP”,可以通过开启linux的core dump指定程序崩溃时生成core文件(默认生成在运行程序的同目录),文件名称默认为core.XXXX。

core dump开启

查看生成core文件是否开启:

[root@localhost ~]#ulimit -c

其他参数说明:

[root@localhost /]# ulimit -a
core file size          (blocks, -c) 1024
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127470
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 127470
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@localhost /]#

结果为0则代表当前所有程序异常崩溃不生成core文件。

[root@localhost ~]# ulimit -c
0       #当前值表示不生成core文件
[root@localhost ~]#

[root@localhost ~]#ulimit -c unlimited   #开启生成core文件,文件大小无限制

[root@localhost ~]#ulimit -c 1024  #开启生成core文件,文件大小限制在1024KB以内

此时再次输入ulimit则能看到core生成规则:

[root@localhost ~]# ulimit -c
0
[root@localhost ~]# ulimit -c 1024
[root@localhost ~]# ulimit -c
1024
[root@localhost ~]#

root@localhost ~]#ulimit -c 0     #关闭core文件生成

在core生成开启的情况下,linux的程序在异常崩溃时一定会产生core文件,当core文件超过限定的大小时,文件将不生成

若在ulimit -c 1024情况下异常崩溃没有生成core文件,则可以通过ulimit -c unlimited 将core的文件规定设置为无限制

查看与解析core文件

[root@localhost]# gdb -c core.100001    #gdb -c core_filename

### coredump解析方法与工具 解析coredump文件是定位程序崩溃原因的重要手段之一。以下是几种常见的解析方法和工具: #### 1. 使用GDB进行解析 GDB是一个功能强大的调试工具,可以用来分析coredump文件。首先需要加载可执行文件和对应的coredump文件: ```bash gdb ./executable_file /path/to/coredump_file ``` 在GDB中,可以通过以下命令获取更多详细信息: - `bt` 或 `backtrace`:显示调用栈信息[^3]。 - `info threads`:查看线程信息。 - `frame <n>`:切换到指定的调用栈帧。 - `list`:查看当前代码位置附近的源代码。 #### 2. 使用addr2line转换地址 如果只需要将内存地址转换为文件名和行号,可以使用`addr2line`工具。例如: ```bash addr2line -e ./my_prog 0x0000555555554689 ``` 这将输出崩溃发生的具体代码位置[^2]。 #### 3. 使用systemd-coredumpcoredumpctl 在基于systemd的系统中,`systemd-coredump`服务可以自动管理coredump文件。启用该服务后,可以使用`coredumpctl`工具来查询和分析coredump文件: ```bash coredumpctl list coredumpctl gdb <PID> ``` 这将直接启动GDB并加载相应的coredump文件。 #### 4. 使用crash工具分析内核崩溃 对于内核崩溃(vmcore文件),可以使用`crash`工具进行分析。`crash`需要搭配内核调试符号一起使用,能够提供详细的内核状态信息。例如: ```bash crash /path/to/vmcore /path/to/vmlinux ``` 通过`crash`工具,可以查看调用栈、任务状态等信息。 #### 5. 检查动态库加载情况 如果coredump文件涉及动态库,可能需要检查动态库的加载地址和大小。可以使用`readelf`工具查看动态库的program header: ```bash readelf -l libqcx_max96722_avm.so ``` 这有助于确认动态库是否正确加载以及其内存范围。 #### 6. 设置coredump文件格式 为了方便分辨coredump文件的来源和时间,可以设置coredump文件的命名格式。例如: ```bash sudo sh -c "echo '/data/coredump/core_$(date +%Y-%m-%d_%H-%M-%S)-%p.dump' > /proc/sys/kernel/core_pattern" ``` 这将生成包含时间戳和进程ID的coredump文件名称[^1]。 #### 7. 删除旧的coredump文件 为了避免磁盘空间被coredump文件占用,可以定期清理旧文件。例如: ```bash find /var/core -type f -mtime +7 -delete ``` 这将删除7天前的coredump文件。 ### 注意事项 - 确保coredump文件和可执行文件的版本匹配。 - 如果使用了strip命令移除符号表,则需要保留未strip的二进制文件以供调试。 - 对于复杂的崩溃问题,可能需要结合日志文件和其他调试信息进行综合分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值