core dump文件

原文地址:http://blog.youkuaiyun.com/hjx5200/article/details/43192431

在程序运行过程中,发生segmentation fault,如果系统提示core dumped,说明为产生core文件。core文件会保存程序运行时的信息,如内存镜像、堆栈调用、寄存器等等,利用相关的工具如gdb可以还原程序发生问题时的情况,便于定位问题代码。

core文件是否生成,以及在哪里生成和文件名等情况,涉及如下文件/proc/sys/kernel/core_uses_pid、/proc/sys/kernel/core_pattern、/proc/sys/kernel/core_pile_limit、/proc/sys/fs/suid_dumpable。首先执行ulimit -c,如果输出结果为0表明系统不能生产core文件,这时可以执行ulimit -c unlimited,使得可以生产core文件,并且不限制core文件的大小。生成的core的文件名则由core_pattern和core_uses_pid共同决定。其中core_pattern有两种模式,一直是直接决定文件名和路径,比如/data/core/core.%e.%p.%s,表明core文件保存在data下面的core目录下,且文件名的格式是core后面加程序名pid号和引发错误的段信号值。

  • %% 单个%字符
  • %p 所dump进程的进程ID
  • %u 所dump进程的实际用户ID
  • %g 所dump进程的实际组ID
  • %s 导致本次core dump的信号
  • %t core dump的时间 (由1970年1月1日计起的秒数)
  • %h 主机名
  • %e 程序文件名

core_pattern的另一个模式是管道模式,以“|”开头,然后跟要执行的程序的绝对路径,如在ubuntu 12.04中,core_parttern文件的内容是“|/usr/share/apport/apport %p %s %c”且core_pipe_limit为0。当通过管道将内存镜像保存时,进程/proc/pid下面的内容不能立即删除,必须等到apport程序保存完内存信息后才可删除,否则信息流失不利于问题定位,这时core_pipe_limit的值决定了 系统中运行并发访问/proc/pid的进程数,如果为0表示不限制并发进程数量。/usr/share/apport/apport是Python脚本,带入的参数由上面的流程的符号意义可知,是进程ID号、导致本次core dump的信号和core文件是否限制limit的值。suid_dumpable文件的值可能为0、1和2。意义不同,0是表明不能产生core文件,1表明debug模式,任何进程都可以产生core,2表明生成的core文件只有root用户可读。


### 如何生成和分析 Core Dump 文件 #### 配置 `ulimit` 以启用 Core Dump 文件生成 在 Linux 系统中,默认情况下可能未启用核心转储功能。为了允许生成 Core Dump 文件,可以通过调整 `ulimit` 参数实现。具体操作如下: 运行以下命令以查看当前系统的 Core Dump 大小限制: ```bash ulimit -c ``` 如果返回值为 `0`,则表示禁用了 Core Dump 功能。要启用该功能,需设置其大小无限制(或其他适当值)。例如: ```bash ulimit -c unlimited ``` 这一步骤确保当程序崩溃时能够生成完整的 Core Dump 文件[^1]。 #### 设置 Core Pattern 定义文件路径 Core Dump 的存储位置及其命名方式由 `/proc/sys/kernel/core_pattern` 控制。编辑此配置项可以让系统自定义 Core Dump 文件的位置与名称格式。常见的占位符包括 `%e` 表示可执行文件名、`%p` 进程 ID 和其他选项如时间戳 `%t` 等[^4]。 修改方法如下所示: ```bash echo "/tmp/core-%e.%p" | sudo tee /proc/sys/kernel/core_pattern ``` 上述例子会将所有的 Core Dumps 存放在临时目录下,并附加应用程序的名字及 PID 来区分不同实例产生的数据[^3]。 #### 使用 GDB 调试 Core Dump 文件 一旦捕获到了一个有效的 Core Dump 文件之后,就可以利用 GNU Debugger (GDB) 对其展开深入研究了。基本流程涉及加载目标二进制镜像连同对应的 Core 数据一起载入调试器环境之中。 启动 GDB 并指定需要审查的目标应用以及关联的核心记录作为输入参数之一即可开始工作流: ```bash gdb ./application_binary_path core_dump_file_name ``` 进入交互界面后尝试一些基础指令来探索现场状态,比如打印栈回溯信息(`bt`)或者检查特定变量的内容等等[^2]: ```plaintext (gdb) bt full # 显示整个调用堆栈详情 (gdb) frame N # 切换至第N层帧上下文中 (gdb) print var # 输出某个局部或全局量var的具体数值表现形式 ``` 通过以上步骤便能有效地定位问题所在并采取相应措施加以修正。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值