近来在学习的过程中,遇见了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
%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
举个板栗吧~
这儿我们听到我们的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,我们可以看一些具体的细节: