linux的core转储位置

linux的core转储位置
abinng😶🌫️linux的core转储位置
如果你在学gdb时遇到这样的问题,那么,本篇应该能帮你解决问题
问题:模拟一个段错误(Segmentation fault)时,明明已经显示了核心已转储(core dump),但在当前目录下找不到core,跟着下面的步骤,大概率能帮你解决该问题
核心转储
首先core dump是什么呢?系统发生严重错误导致崩溃时,自动生成的一个文件,通常用GDB分析该文件可以帮助调试、修复程序中的错误
设置核心转储文件大小
1
2查看core file size项是否为0
ulimit -a1
2
3
4
5
6
7
8若显示为0,使用下面的命令启用核心转储
ulimit -c unlimited
此时可以编辑配置文件,即可默认启用
sudo vi ~/.bashrc
在末尾添加以下行:
ulimit -c unlimited
退出编辑器后可执行以下命令使其立即生效
source ~/.bashrc该步骤执行完后,尝试再次执行段错误文件,查看是否生成core文件,若生成了core文件,则到此即可结束;若没有生成,请继续跟着下面的步骤
设置核心转储位置
已经启用了核心转储功能,为什么还是找不到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/查看生成路径
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
using namespace std;
int main()
{
cout << "hello world!" << endl;
int *ptr = NULL;
*ptr = 520;
return 0;
}
1 | 编译、执行 |
查看是否生成核心文件
1 | ls -l /tmp/dump/cores/ |
到此,该问题基本就被解决了
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果







