近来在学习的过程中,遇见了Segmentfault(段错误)的问题linux 不生成core文件,经过一番查找资料,学到了一些相关知识,这儿做一个梳理,以防之后在碰到类似的问题,而且希望还能帮助到你们一丝丝!

哪些是Segmentfault?

在操作系统中,显存被界定为多个段(Segments)linux 不生成core文件,每位段储存着不同类型的数据,如代码段、数据段等。SegmentationFault(段错误)是一种常见的程序错误,它一般发生在程序企图访问无效的显存地址或未初始化的显存区域,或则表针操作不当、数组越界、动态显存分配问题等诱因引起的。这些错误一般因为程序编撰错误或表针使用不当造成。当程序执行过程中发生SegmentationFault错误时,操作系统会向程序发送一个SIGSEGV讯号,造成程序停止运行。

SegmentationFault的常见诱因怎么解决SegmentationFault错误。

实际上,我们可以通过仔细检测代码去逐一排查错误发生点,而且面对一个庞大的项目,涉及到的内容好多的时侯,我们一一排查都会很费力,有时侯也是徒劳的。这时,我们就可以利用一些调试工具,来检测错误的位置。

下边来讲一下,在Linux系统中,怎样利用gdb查看core文件来定位错误!哪些是core文件?

在Linux系统下,当程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个显存映像,同时加上调试信息,编译时须要加上-g-Wall)。我们使用gdb来查看core文件,可以指示出造成程序出错的代码所在文件和行数。

怎样生成core文件和大小限制

当系统程序运行形成SegmentationFault而不是显示Segmentationfault(coredumped)这说明,并没有形成code文件,我们须要执行以下命令来世成code文件,并限制文件大小。

注意:,这只对一个终端有效,再打开一个终端就无效了,要想整体更改,我们须要在系统/etc/profile文件的最后,添加以下一行:

ulimit -c unlimited

之后,执行以下命令,使其生效:

source /etc/profile

这时侯我们再度运行程序,都会发觉Segmentationfault(coredumped),说明早已生成了code文件,而且它在哪呢?

查询coredump文件路径,可以通过以下命令查询:

cat /proc/sys/kernel/core_pattern

或则

/sbin/sysctl kernel.core_pattern

core文件的名称:core文件生成路径:输入可执行文件运行命令的同一路径下。若系统生成的core文件不带其它任何扩充名称,则全部命名为core。新的core文件生成将覆盖原先的core文件。

/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩充。

文件内容为1,表示添加pid作为扩充名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。

可通过以下命令更改此文件:

echo "1" > /proc/sys/kernel/core_uses_pid 

更改core文件保存位置和文件名格:

更改/proc/sys/kernel/core_pattern,可通过以下命令更改此文件:

echo "/corefile/core-%e-%p-%t" > core_pattern

可以将core文件统一生成到/corefile目录(必须保证有这个目录)下,也可以自己指定生成路径,形成的文件名为core-命令名-pid-时间戳,以下是参数列表:

%p-insertpidintofilename添加pid

%u-insertcurrentuidintofilename添加当前uid

%g-insertcurrentgidintofilename添加当前gid

linux 不生成core文件_linux 不生成core文件_linux 不生成core文件

%s-insertsignalthatcausedthecoredumpintothefilename添加造成形成core的讯号

%t-insertUNIXtimethatthecoredumpoccurredintofilename添加core文件生成时的unix时间

%h-inserthostnamewherethecoredumphappenedintofilename添加主机名

%e-insertcoredumpingexecutablenameintofilename添加命令名

注意:

sysctl -w "kernel.core_pattern=$core_dir/core_%e_%t" >/dev/null  
sysctl -w "kernel.core_uses_pid=0" >/dev/null

此时,我们就形成了code文件

怎样借助code文件进行调试呢?

yum install -y gdb.x86_64

举个板栗吧~

linux 不生成core文件_linux 不生成core文件_linux 不生成core文件

这儿我们听到我们的code文件,接出来,使用以下命令,进行调试:

形成了以下结果:

这儿都会晓得我们出现错误的位置。

新的问题又来了,我们从上图可以看出,缺乏缺位独立的调试信息,该如何办呢?

何为“独立的调试信息”?假如编撰代码后使用gcc编译器进行编译时,若不加上-g编译参数,或后期使用strip工具进行二次处理,生成的二补码文件上将不带调试段信息,而gdb的调试都是基于该调试段进行的,在linux世界这部份内容常常也被叫做debuginfo。

其次,各大发行版提供的二补码软件包为了缩小容积linux学习,且用户常常不须要对软件(包括内核、libc这类基础设施)本身进行调试linux windows,因而常常不带调试信息。因为在Linux环境下绝大部份程序都依赖于libc(包括最简单的helloworld),若系统预装的libc未带调试段信息,将影响gdb对目标程序进行调试操作。

该怎么解决呢?

vim /etc/yum.repos.d/CentOS-Debuginfo.repo

将enable改为1

yum install glibc
yum install yum-utils
debuginfo-install glibc-2.17-326.el7_9.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64 

实际上,最后一句命令就是图片中提示的。

再度使用gdb,就发觉不会提示Missingseparatedebuginfos,u…..啦~

通过where,我们可以看一些具体的细节:

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复