Linux下core文件调试

本文介绍了在Linux环境下,当程序出现'core dumped'错误时,如何利用core文件进行调试。core文件是程序运行时的内存快照,包含内存信息、寄存器状态等,用于诊断难以复现的错误。默认情况下,Linux不生成core文件,需要通过`ulimit -c`命令开启。此外,还可以设置core文件的保存路径和命名格式,以便于管理和查找。

一:core dumped错误

在Linux上编写C/C++程序时,往往会发生如下错误:core dumped

#include<iostream>
using namespace std;
int main()
{
    int *p;
    *p = 20;//使用了野指针
}

对于上述这样的一个小小程序很容易定位到错误的源头,但是对于成百上千行的代码来说定位一个错误就很不容易了,尤其是在运行之后发生bug,但是core文件却很容易定位到错误之处。

二:简单介绍什么是core文件以及它的作用

在上述的错误中,使用简单的调试很难找到错误的源头,然而使用core确驾轻就熟。那什么是core文件呢?

其实core文件在Linux下是一种ELF格式的文件,有关什么是ELF格式大家可以自行查阅相关的内容。

在这里插入图片描述

实际上core文件就是可执行文件执行时的映像,也可以叫做内存的快照。它记录下来可执行程序在执行过程中的点点滴滴。除了内存信息之外,还有一些关键的程序运行状态也会同时dump下来,例如寄存器信息(包括程序指针,栈指针等等),内存管理信息,其他处理器和操作系统状态和信息。

作用:core文件对于程序诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而core文件可以再现程序出错时的情景。结合gdb调试命令可以对core文件进行调试。

三:如何保存core文件

在linux下,默认的情况是core dumped并不产生core文件,因为此项功能默认是被关闭。使用ulimit - c命令可以查看是否启动core文件。执行上述命令后会有如下三种可能分别代表着不同的含义:

在这里插入图片描述

1. 0             不能产生core文件
2.unlimited      产生的core文件没有字节限制
3.一个确定的数字  当超过这个字节数时不能产生core文件,小于等于是可以产生core文件

也即是 通过 ulimit -c unlimited 命令就可以打开core文件了,root用户

这样的设置总是一次性的,想要一劳永逸,那就需要修改配置文件。当你的可执行程序再次出现core dumped的情况下,就会在当前目录下出现一个core文件

四:设置core文件的生成路径以及core文件的名称格式。

(1)设置进程的pid作为core文件的拓展名,这样的好处是当core文件有很多时,可以区分是哪一个可执行程序产生的core文件,方便查找。

1:添加进程的pid作为core文件拓展名,生成的core文件名称为core.pid

0:不添加pid作为文件拓展名,生成的core文件名称为core

//修改方法

1. 修改 /proc/sys/kernel/core_uses_pid文件内容为:1
2. 在终端执行如下两条命令的任意一条
echo "1" > /proc/sys/kernel/core_uses_pid
sysctl -w kernel.core_uses_pid=1 kernel.core_uses_pid = 1

(2)修改core文件的文件格式以及保存路径

执行如下命令的一条即可
1. echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
标识生成的core文件格式是 core-%e-%p-%t,保存路径为/corefile

2. sysctl -w kernel.core_pattern=/corefile/core-%e-%p-%t kernel.core_pattern = /corefile/core-%e-%p-%t

以下是参数列表:

%p - insert pid into filename 添加pid(进程id)
%u - insert current uid into filename 添加当前uid(用户id)
%g - insert current gid into filename 添加当前gid(用户组id)
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加导致产生core的命令名

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值