linux的core转储位置

linux的core转储位置

如果你在学gdb时遇到这样的问题,那么,本篇应该能帮你解决问题

问题:模拟一个段错误(Segmentation fault)时,明明已经显示了核心已转储(core dump),但在当前目录下找不到core,跟着下面的步骤,大概率能帮你解决该问题

  1. 核心转储

    首先core dump是什么呢?系统发生严重错误导致崩溃时,自动生成的一个文件,通常用GDB分析该文件可以帮助调试、修复程序中的错误

  2. 设置核心转储文件大小

    1
    2
    # 查看core file size项是否为0
    ulimit -a

    image-20250712184618168

    1
    2
    3
    4
    5
    6
    7
    8
    # 若显示为0,使用下面的命令启用核心转储
    ulimit -c unlimited
    # 此时可以编辑配置文件,即可默认启用
    sudo vi ~/.bashrc
    # 在末尾添加以下行:
    ulimit -c unlimited
    # 退出编辑器后可执行以下命令使其立即生效
    source ~/.bashrc

    该步骤执行完后,尝试再次执行段错误文件,查看是否生成core文件,若生成了core文件,则到此即可结束;若没有生成,请继续跟着下面的步骤

  3. 设置核心转储位置

    已经启用了核心转储功能,为什么还是找不到core?因为其被发送到其他程序了(如abrt或Apport等),接下来我们来设置位置在固定目录中

    1
    2
    3
    4
    5
    6
    # 创建一个目录用于存放core文件
    mkdir -p /tmp/dump/cores/
    # 授予权限
    chmod a+x /tmp/dump/cores/
    或者
    chmoe 755 /tmp/dump/cores/

    查看生成路径

    image-20250712190510237

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 临时设置核心转储路径(重启后失效)
    echo '/tmp/dump/cores/core_%e.%p_%t' | sudo tee /proc/sys/kernel/core_pattern
    # 此处参数----%e:执行时间 %p:进程的pid %t:时间戳

    # 编辑/etc/sysctl.conf临时转永久设置
    sudo vi /etc/sysctl.conf
    # 添加以下行:
    kernel.core_pattern = /tmp/dump/cores/core.%e.%p.%t
    执行 sysctl -p 立即生效,或者重启系统后查看

    接下来再次执行模拟段错误的可执行文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>

    using namespace std;

    int main()
    {

    cout << "hello world!" << endl;
    int *ptr = NULL;
    *ptr = 520;

    return 0;
    }
1
2
3
# 编译、执行
g++ -g 文件名.cpp
./a.out

查看是否生成核心文件

1
ls -l /tmp/dump/cores/

image-20250712191939727

到此,该问题基本就被解决了