linux下使用core文件对程序进行debug

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ASJBFJSB/article/details/86437687

一.简单介绍什么是core文件以及他的作用
在linux编写的C/C++可执行程序往往会出现如下图的错误,一个core dumped。由于刚开始对linux的认识不足,就忽略了这样一个重要的调试信息。
core dumped
随着学习的深入,其实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.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
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的命令名

三.使用core文件进行简单debug。
测试程序一:

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

在这里插入图片描述
对于上述这样的一个小程序很容易定位到错误的源头,但是对于一个成百上千行的代码来说定位一个错误就不容易了尤其是在运行之后发生的bug,但是使用core文件却很容易定位。
调试上述文件生成的core文件:
在这里插入图片描述
通过core文件可以清楚的定位到错误的根源,可见core文件的强大之处。
测试程序二:

test1.cpp
#include <iosreram>
using namespace std;

int main(){
	cout<<(10 / 0)<<endl;
	return 0;
}

在这里插入图片描述
使用test1生成的core文件定位错误:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ASJBFJSB/article/details/86437687