|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。
Core,又称之为CoreDump文件,是Unix/Linux操纵体系的一种机制,关于线上服务而言,Core使人闻之色变,由于出Core的历程意味着服务临时不克不及一般呼应,必要恢复,而且跟着吐Core历程的内存空间越年夜,此历程大概延续很长一段工夫(比方当历程占用60G+以上内存时,完全Core文件必要15分钟才干完整写到磁盘上),这时代发生的流量丧失,不成估计。
凡事皆有两面性,OS在出Core的同时,固然会停止失落以后历程,可是也会保存下第一手的现场数据,OS似乎是一架被按下快门的相机,而照片就是产出的Core文件。内里含有当历程被停止时内存、CPU存放器等信息,能够供后续开辟职员举行调试。
关于Core发生的缘故原由良多,好比已往一些Unix的版本不撑持古代Linux上这类GDB间接附着到历程长进行调试的机制,必要先向历程发送停止旌旗灯号,然后用工具浏览core文件。在Linux上,我们就能够利用kill向一个指定的历程发送旌旗灯号大概利用gcore命令来使其自动出Core并加入。假如从浅条理的缘故原由下去讲,出Core意味着以后历程存在BUG,必要程序员修复。从深条理的缘故原由上讲,是以后历程冒犯了某些OS层级的回护机制,强制OS向以后历程发送诸如SIGSEGV(即signal11)之类的旌旗灯号,比方会见空指针或数组越界出Core,实践上是冒犯了OS的内存办理,会见了非以后历程的内存空间,OS必要经由过程出Core来举行警示,这就仿佛一团体身材内存在病毒,免疫体系就会经由过程发烧来警示,并招致人体发热是一个事理(成心思的是,并非每次数组越界城市出Core,这和OS的内存办理中假造页面分派巨细和界限有关,即便不出Core,也很有大概读到脏数据,引发后续程序举动杂乱,这是一种很难清查的BUG)。
说了这些,仿佛感到Core很强势,让人感到缺少把持力,实在否则。把持Core发生的举动和体例,有两个路子:
1.修正/proc/sys/kernel/core_pattern文件,此文件用于把持Core文件发生的文件名,默许情形下,此文件内容只要一行内容:“core”,此文件撑持定制,一样平常利用%共同分歧的字符,这里排列几种:- %t出Core的工夫,从1970-01-0100:00:00入手下手的秒数
复制代码 2.Ulimit–C命令,此命令能够显现以后OS关于Core文件巨细的限定,假如为0,则暗示不同意发生Core文件。假如想举行修正,可使用:
Ulimit–cn
个中n为数字,暗示同意Core文件体积的最年夜值,单元为Kb,假如想设为无穷年夜,能够实行:
Ulimit-cunlimited
发生了Core文件以后,就是怎样检察Core文件,并断定成绩地点,举行修复。为此,我们无妨先来看看Core文件的格局,多懂得一些Core文件。
起首能够明白一点,Core文件的格局ELF格局,这一点能够经由过程利用readelf-h命令来证明,以下图:
从读出来的ELF头信息能够看到,此文件范例为Core文件,那末readelf是怎样得知的呢?能够从上面的数据布局中窥得一二:
个中当值为4的时分,暗示以后文件为Core文件。云云,全部历程就很分明了。
懂得了这些以后,我们来看看怎样浏览Core文件,并从中清查BUG。在Linux下,一样平常读取Core的命令为:
gdbexec_filecore_file
利用GDB,先从可实行文件中读取标记表信息,然后读取Core文件。假如不与可实行文件搅合在一同能够吗?谜底是不可,由于Core文件中没有标记表信息,没法举行调试,可使用以下命令来考证:
Objdump–xcore_file|tail
我们看到以下两行信息:
SYMBOLTABLE:
nosymbols
标明以后的ELF格局文件中没有标记表信息。
为懂得释怎样看Core中信息,我们来举一个复杂的例子:
#include“stdio.h”
intmain(){
intstack_of[100000000];
intb=1;
int*a;
*a=b;
}
这段程序利用gcc–ga.c–oa举行编译,运转后间接会Core失落,利用gdbacore_file检察栈信息,可见其Core在了这行代码:
intstack_of[100000000];
缘故原由很分明,间接在栈上请求云云年夜的数组,招致栈空间溢出,冒犯了OS关于栈空间巨细的限定,以是出Core(这里是不是出Core还和OS对栈空间的巨细设置有关,通常是8M)。可是这里要明白一点,真正出Core的代码不是分派栈空间的intstack_of[100000000],而是前面这句intb=1,为什么?出Core的一种缘故原由是由于对内存的不法会见,在下面的代码平分配数组stack_of时并未会见它,可是在厥后声明变量并赋值,就相称于举行了越界会见,继而出Core。为懂得释得更具体些,让我们利用gdb来看一下出Core的中央,利用命令gdbacore_file可见:
可知程序呈现了段毛病“Segmentationfault”,代码是intb=1这句。我们来检察一下以后的栈信息:
个中可见指令指针rip指向地点为0 |
|