Linux 中 core dump 文件的作用和利用方法

打印 上一主题 下一主题

主题 962|帖子 962|积分 2886

一 、概述

1.1 什么是 core dump 文件?

Core dump 文件是指在程序崩溃或异常竣事时,利用体系将程序的内存信息、寄存器状态、堆栈信息等保存到文件中以便举行调试和分析的文件。Core dump 文件通常包含了程序崩溃时的全部状态信息,可以资助程序员快速定位程序崩溃的缘故原由并举行修复。
core dump文件紧张包含了用户空间的内存信息,包括用户空间栈、代码段、数据段和堆等。当一个进程因为某种缘故原由(例如,非法内存访问、非法指令等)异常终止时,利用体系可以将进程的内存信息保存到一个core dump文件中。这个文件可以用于后续调试,以便找出题目标根源。
core dump文件通常不包含内核空间栈的信息,因为出于安全和隔离的缘故原由,利用体系不会将内核空间的信息暴露给用户态程序。因此,core dump文件紧张用于分析用户空间的程序题目,而不是内核题目。
1.2 core dump 文件的作用和意义

Core dump 文件的作用非常紧张,它可以资助程序员分析程序崩溃时的状态信息,定位程序崩溃的缘故原由并举行修复。通过分析 core dump 文件,程序员可以相识程序崩溃时的内存信息、寄存器状态、堆栈信息等,以及程序运行时的其他状态信息。这些信息可以资助程序员快速定位程序崩溃的缘故原由,进步程序的稳固性和可靠性。
1.3 Linux 中 core dump 文件的保存路径和命名规则

在 Linux 中,core dump 文件的保存路径和命名规则是可以配置的。默认情况下,core dump 文件保存在当前工作目录下,文件名以 core 开头,背面跟着进程号。例如,进程号为 123 的进程的 core dump 文件名为 core.123。
可以通过修改体系配置文件来指定 core dump 文件的保存路径和命名规则。在 Linux 中,core dump 文件的保存路径和命名规则通常由以下两个文件决定:
/proc/sys/kernel/core_pattern:该文件指定了 core dump 文件的命名规则和保存路径。例如,可以将 core dump 文件保存到 /var/crash 目录下,并利用进程名加进程号作为文件名,命令规则为:/var/crash/%!e(MISSING).%!p(MISSING).core。
/etc/security/limits.conf:该文件指定了生成 core dump 文件的大小限制。可以通过修改该文件来限制 core dump 文件的大小,以避免占用过多的磁盘空间。

二、怎样开启 core dump 文件的生成

在 Linux 中,默认情况下是不会生成 core dump 文件的,必要手动开启。下面介绍三种开启 core dump 文件生成的方法:
2.1 ulimit 命令

ulimit 命令可以用来限制进程的资源利用量,例如文件大小、内存利用量等。通过设置 ulimit 命令的参数,可以开启 core dump 文件的生成。具体步调如下:
执行 ulimit -c unlimited 命令,将 core dump 文件的大小限制设置为无限制。
运行程序,当程序崩溃或异常竣事时,core dump 文件会自动生成。
2.2 sysctl 命令

sysctl 命令可以用来修改内核参数。通过设置 sysctl 命令的参数,可以开启 core dump 文件的生成。具体步调如下:
执行 sysctl -w kernel.core_pattern=/tmp/core-%!e(MISSING)-%!s(MISSING)-%!u(MISSING)-%!g(MISSING)-%!p(MISSING)-%!t(MISSING) 命令,将 core dump 文件的命名规则设置为 /tmp/core-%!e(MISSING)-%!s(MISSING)-%!u(MISSING)-%!g(MISSING)-%!p(MISSING)-%!t(MISSING)。
执行 ulimit -c unlimited 命令,将 core dump 文件的大小限制设置为无限制。
运行程序,当程序崩溃或异常竣事时,core dump 文件会自动生成。
2.3 /proc/sys/kernel/core_pattern 文件

可以通过修改 /proc/sys/kernel/core_pattern 文件来开启 core dump 文件的生成。具体步调如下:
执行 echo “/tmp/core-%!e(MISSING)-%!s(MISSING)-%!u(MISSING)-%!g(MISSING)-%!p(MISSING)-%!t(MISSING)” > /proc/sys/kernel/core_pattern 命令,将 core dump 文件的命名规则设置为 /tmp/core-%!e(MISSING)-%!s(MISSING)-%!u(MISSING)-%!g(MISSING)-%!p(MISSING)-%!t(MISSING)。
执行 ulimit -c unlimited 命令,将 core dump 文件的大小限制设置为无限制。
运行程序,当程序崩溃或异常竣事时,core dump 文件会自动生成。
通过以上几种方法,可以开启 core dump 文件的生成,以便对程序的崩溃或异常情况举行调试和分析。

三、怎样分析 core dump 文件

当程序发生异常或崩溃时,利用体系会生成一个 core dump 文件。这个文件包含了程序崩溃时的内存状态,可以资助开发者快速定位题目。下面介绍几个常用的工具来分析 core dump 文件。
3.1 gdb 调试工具

gdb 是一个强盛的调试工具,可以用于调试 C 和 C++ 程序。它可以读取 core dump 文件,并提供了一系列命令来分析程序崩溃时的内存状态。
利用 gdb 分析 core dump 文件的步调如下:
打开 core dump 文件:
gdb
检察程序崩溃时的堆栈信息:
(gdb) bt

检察程序崩溃时的变量值:
(gdb) p
检察程序崩溃时的寄存器状态:
(gdb) info registers

检察程序崩溃时的汇编代码:
(gdb) disassemble
3.2 objdump 工具

objdump 是一个反汇编工具,可以将可执行文件和共享库文件反汇编成汇编代码。它可以用于分析程序崩溃时的汇编代码,找出题目地点。
利用 objdump 分析 core dump 文件的步调如下:
检察 core dump 文件中的程序代码段:
objdump -d -j .text
检察 core dump 文件中的程序数据段:
objdump -s -j .data
检察 core dump 文件中的程序符号表:
objdump -t
3.3 readelf 工具

readelf 是一个用于检察可执行文件和共享库文件的 ELF 格式文件头的工具。它可以用于分析程序崩溃时的内存结构,找出题目地点。
利用 readelf 分析 core dump 文件的步调如下:
检察 core dump 文件中的程序段:
  1. readelf -S <executable>
复制代码
检察 core dump 文件中的程序符号表:
  1. readelf -s <executable>
复制代码
检察 core dump 文件中的程序动态链接信息:
  1. readelf -d <executable>
复制代码
3.4 coredumpctl 命令

coredumpctl 是一个命令行工具,用于管理体系中的 core dump 文件。它可以用于检察体系中迩来发生的 core dump 文件,以及对这些文件举行分析。
利用 coredumpctl 命令分析 core dump 文件的步调如下:
检察体系中迩来发生的 core dump 文件:
  1. coredumpctl list
复制代码
检察指定的 core dump 文件:
  1. coredumpctl info <coredump>
复制代码
分析指定的 core dump 文件:
  1. coredumpctl gdb <coredump>
复制代码

四、怎样限制 core dump 文件的大小

在许多情况下,生成的 core dump 文件可能非常大,占用大量磁盘空间。为了避免这种情况,您可以限制 core dump 文件的大小。以下是几种方法:
4.1 ulimit 命令

可以利用 ulimit 命令来限制用户的 core dump 文件大小。以下是一个示例:
  1. $ ulimit -c 1000000
复制代码
此命令将限制用户生成的 core dump 文件的大小为 1 MB。如果实验生成更大的文件,程序将终止并返回错误。
4.2 /etc/security/limits.conf 文件

您还可以在 /etc/security/limits.conf 文件中设置 core dump 文件大小限制。以下是一个示例:
  1. *               soft    core            1000000
复制代码
此行将限制全部用户生成的 core dump 文件的大小为 1 MB。您可以根据必要调解此值。
要使此更改生效,您必要重新启动体系或注销并重新登录。
4.3 core_pattern 文件

在 Linux 体系中,生成的 core dump 文件的名称和位置由 core_pattern 文件界说。如果您想在生成 core dump 文件时限制其大小,可以在 core_pattern 文件中添加%!h(MISSING)/%!e(MISSING).%!p(MISSING).core.%!t(MISSING)和 |/bin/dd of=/path/to/core/files/core.%!e(MISSING).%!p(MISSING).%!t(MISSING) bs=1M count=10,如下所示:
  1. echo "%!h(MISSING)/%!e(MISSING).%!p(MISSING).core.%!t(MISSING)" > /proc/sys/kernel/core_pattern
  2. echo "|/bin/dd of=/path/to/core/files/core.%!e(MISSING).%!p(MISSING).%!t(MISSING) bs=1M count=10" >> /proc/sys/kernel/core_pattern
复制代码
这将将 core dump 文件写入 /path/to/core/files/ 目录,并将其大小限制为 10 MB。您可以根据必要调解此值。
请留意,修改 core_pattern 文件可能会影响全部正在运行的程序。如果您不确定怎样修改此文件,请先备份原始文件。

五、怎样清理无用的 core dump 文件

5.1 手动删除

手动删除无用的 core dump 文件是最简单的方法。您可以利用以下命令来删除它们:
  1. $ rm /path/to/core/files/*.core
复制代码
请留意,这将删除 /path/to/core/files/ 目录中全部 .core 文件。如果您只想删除特定日期之前的文件,可以利用 find 命令:
  1. $ find /path/to/core/files/ -type f -name "*.core" -mtime +7 -delete
复制代码
这个命令将删除 /path/to/core/files/ 目录中超过 7 天的全部 .core 文件。
5.2 自动清理脚本

为避免手动清理 core dump 文件,您可以编写一个自动清理脚本。以下是一个示例脚本:
  1. #!/bin/bash
  2. CORE_DIR=/path/to/core/files/
  3. DAYS_TO_KEEP=7
  4. find $CORE_DIR -type f -name "*.core" -mtime +$DAYS_TO_KEEP -delete
复制代码
将以上脚本保存为 clean_core_files.sh 并添加可执行权限:
  1. $ chmod +x clean_core_files.sh
复制代码
您可以将此脚本添加到 cron 中以定期运行:
  1. $ crontab -e
复制代码
然后添加以下行:
  1. 0 0 * * * /path/to/clean_core_files.sh
复制代码
这将在每天半夜清理一次 core dump 文件。
5.3 coredumpctl 命令

如果您正在利用 Systemd,您可以利用 coredumpctl 命令来管理 core dump 文件。
以下是一些常用的 coredumpctl 命令:
列出全部 core dump 文件:
  1. $ coredumpctl list
复制代码
扫除全部 core dump 文件:
  1. $ coredumpctl purge
复制代码
检察特定 core dump 文件的详细信息:
  1. $ coredumpctl info /path/to/core/file
复制代码
提取 core dump 文件中的堆栈跟踪信息:
  1. $ coredumpctl gdb /path/to/core/file
复制代码
请留意,coredumpctl 命令必要 Systemd 支持,并且只能在运行 Systemd 的体系上利用。

六、实例分析

在分析 core dump 文件之前,您必要安装 GDB 工具。以下是在 Ubuntu 上安装 GDB 的命令:
  1. $ sudo apt-get install gdb
复制代码
6.1 分析 core dump 文件中的堆栈信息

要分析 core dump 文件中的堆栈信息,请利用以下命令:
  1. $ gdb /path/to/executable /path/to/core/file
复制代码
这将打开 GDB 命令行界面并加载 core dump 文件。您可以利用 bt 命令检察堆栈跟踪信息:
  1. (gdb) bt
复制代码
此命令将显示函数调用堆栈跟踪信息,以资助您确定程序崩溃的缘故原由。
6.2 分析 core dump 文件中的寄存器信息

要分析 core dump 文件中的寄存器信息,请利用以下命令:
  1. $ gdb /path/to/executable /path/to/core/file
复制代码
然后利用 info registers 命令检察全部寄存器的值:
  1. (gdb) info registers
复制代码
此命令将显示全部寄存器的值,以资助您相识程序崩溃时的状态。
6.3 分析 core dump 文件中的内存信息

要分析 core dump 文件中的内存信息,请利用以下命令:
  1. $ gdb /path/to/executable /path/to/core/file
复制代码
然后利用 x 命令检察内存内容:
  1. (gdb) x/nfu address
复制代码
此中 n 是要显示的内存单元数,f 是显示格式,u 是单位大小,address 是要检察的内存地址。例如,以下命令将显示从地址 0x0 开始的前 16 个字节:
  1. (gdb) x/16xb 0x0
复制代码
此命令将以十六进制格式显示 16 个字节,以资助您相识程序崩溃时内存的状态。

七、常见题目息争决方案

在利用 core dump 文件举行调试和分析时,可能会碰到一些常见题目。以下是一些常见题目息争决方案:
7.1 无法生成 core dump 文件

如果您无法生成 core dump 文件,请确保以下条件已满意:
利用体系允许生成 core dump 文件。
程序已经设置了生成 core dump 文件的限制(例如利用 ulimit 命令)。
程序没有在运行时屏蔽了生成 core dump 文件的信号。
如果您仍旧无法生成 core dump 文件,请实验利用 strace 命令来跟踪程序并检察是否有任何错误消息。
7.2 core dump 文件过大导致磁盘空间不足

如果您的程序生成的 core dump 文件过大,可能会导致磁盘空间不足。在这种情况下,您可以实验以下解决方案:
限制生成的 core dump 文件大小(例如利用 ulimit 命令)。
将 core dump 文件写入其他磁盘或存储装备。
定期清理无用的 core dump 文件。
7.3 core dump 文件中的信息不完整或不正确

如果您发现生成的 core dump 文件中的信息不完整或不正确,可能有以下缘故原由:
程序在生成 core dump 文件时已经修改了内存或状态。
生成的 core dump 文件中可能只包含部分信息(例如仅包含当前线程的信息)。
利用的调试工具可能无法正确解析 core dump 文件中的信息。
在这种情况下,您可以实验利用其他调试工具或利用其他方法举行调试和分析。

八、C/C++ 中控制core dump 文件

在 Linux 体系中,我们可以利用 rlimit 和 core_pattern 管理 coredump 文件。以下是怎样在 C++ 程序中设置 coredump 文件的生成、生成路径以及关闭生成的示例:

  • 包含必要的头文件:
  1. #include <sys/resource.h>
  2. #include <fstream>
  3. #include <unistd.h>
复制代码

  • 创建一个函数 enable_coredump 用于启用 coredump:
  1. void enable_coredump() {
  2.     // 设置 coredump 文件大小限制
  3.     struct rlimit core_limits;
  4.     core_limits.rlim_cur = core_limits.rlim_max = RLIM_INFINITY;
  5.     setrlimit(RLIMIT_CORE, &core_limits);
  6. }
复制代码

  • 创建一个函数 disable_coredump 用于禁用 coredump:
  1. void disable_coredump() {
  2.     // 设置 coredump 文件大小限制为 0
  3.     struct rlimit core_limits;
  4.     core_limits.rlim_cur = core_limits.rlim_max = 0;
  5.     setrlimit(RLIMIT_CORE, &core_limits);
  6. }
复制代码

  • 创建一个函数 set_coredump_path 用于设置 coredump 文件的生成路径:
  1. void set_coredump_path(const std::string &path) {
  2.     std::ofstream ofs("/proc/sys/kernel/core_pattern");
  3.     ofs << path << "/core.%e.%p";
  4.     ofs.close();
  5. }
复制代码

  • 在 main 函数中调用以上函数来启用、禁用或设置 coredump 文件生成路径:
  1. int main() {
  2.     // 启用 coredump
  3.     enable_coredump();
  4.     // 设置 coredump 文件生成路径
  5.     set_coredump_path("/path/to/dump/directory");
  6.     // ...其他代码...
  7.     // 在需要的时候禁用 coredump
  8.     disable_coredump();
  9.     // ...其他代码...
  10.     return 0;
  11. }
复制代码
留意:在运行这个程序时,你可能必要利用 root 权限,因为修改 /proc/sys/kernel/core_pattern 可能必要更高的权限。别的,必要确保 coredump 文件的生成路径可写。
如今,你的 C++ 程序可以在 Linux 体系中设置 coredump 文件的生成、生成路径以及关闭生成。如果程序崩溃,体系将在指定的路径中生成 coredump 文件。
九、总结

在本文中,我们介绍了 core dump 文件的概念和作用,并学习了怎样生成、捕获和分析这些文件。我们相识了怎样利用 GDB 工具分析 core dump 文件中的堆栈、寄存器和内存信息,以资助我们诊断程序崩溃的缘故原由和调试错误。
我们还讨论了怎样清理无用的 core dump 文件,包括手动删除、编写自动清理脚本和利用 coredumpctl 命令。
最后,我们强调了在开发和测试过程中生成和分析 core dump 文件的紧张性,因为它们可以提供有关程序崩溃的有效信息,资助我们改进代码质量和进步体系稳固性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表