欢迎来到天天文库
浏览记录
ID:20605157
大小:92.50 KB
页数:4页
时间:2018-10-14
《linux上coredump的机制内容和分析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Linux上CoreDump的机制、内容和分析Psqa左玉龙Core,又称之为CoreDump,是Unix/Linux操作系统的一种机制,对于线上服务而言,Core令人闻之色变,因为出Core的过程意味着服务暂时不能正常响应,需要恢复,并且隨着吐Core逬程的内存空间越大,此过程可能持续很长一段时间(fel如当进程占用60G+以上内存时,完整Core^:件需要15分钟才能完全写到磁盘
2、),这期间产生的流量损失,不可估量。凡事皆有两面性,OS在出Core的同时,虽然会终止掉当前逬程,但是也会保留下第一手的现场数
3、据,OS仿佛是一架被按下快门的相机,而照片就是产出的Core艾件。里面含有当进程被终止时内存、CIH;寄存器等信息,可以供后续开发人员进行调试。矢于Core产生的原因很多,比如过去一些tnix的版本不支持现代Linux上这种GDB直接附着到逬程上逬行调试的机制,需要先向进程发送终止信号,然后用工具阅读core文件。在Linux上,我们就可以使用kill向一个指定的逬程发送信号或者使用gcore命今来使其主动出Core并退出。如果从浅B次的原因上来讲,出Core意味着当前逬程存在BUG,需要程序员修复。从深展次
4、的原因上讲,是当前进程触犯了某些OS层级的保护机制,逼迫OS向当前逬程发送诸如STGSEGV(即signal11)之类的信号,例如访冋空指针或数组越界出Core,实际上是触犯了OS的内存管理,访问了非当前进程的内存空间,OS需要通过出Core来进行警示,这就好像一个人身体内存在病毒,免疫系统就会通过发热来警示,并导致人体发烧是一个道理(有意思的是,并不是每次数组越界都会出Core,这和OS的内存管理中虚似页面分配大小和边界有关,即使不出Core,也很有可能读到脏数据,引起后续程序行为紊乱,这是一种很难追查的B
5、UG)。说了这些,似乎感觉Core很强势,让人感觉缺乏控制力,其实不然。控制Core产生的行为和方式,有两个途径:1.修改/proc/sys/kernel/core_pattern文件,此文件用于控制Core艾件产生的艾件名,默认情况下,此文件内容只有一行内容:“core”,此文件支持定制,一般使用%配合不同的字符,这里罗列几种:Z%p出Core逬程的PTDZ%u出Core进程的UIDZ%s造成Core的signal号%t出Core的时间,从1970-01-010(k0(k00幵始的秒数Z%e出Core进程对
6、应的可执行文件名更强大的是,我扪可以在此文件中配置管道,来將产生的Core文件作为输入,送给某个特定的处理程序,例如网络传输程序,可以将产出的Core直接送到另一台服务器上,这对于小硬盘服务器来说,是一个不错的选择。2.Ulimit-€命令,此命令可以显示当前OS对于Core文件大小的限制,如果为0,则表示不允许产生Core文件。如果想逬行修改,可以使用:U1imit-cn其中n为数字,表示允许Core文件体枳的最大值,单位为Kb,如果想设为无限大,可以执行:Ulimit-cunlimilcd产生了Core文
7、件之后,就是如何查看Core文件,并确定问题所在,进行修复。为此,我们不妨先来看看Core文件的格式,多了解一些Core文件。首先可以明确一点,Core文件的格式ELF格式,这一点可以通过使用readelf_h命今来证实,如下图:ELFHeader:Magic:7f454c460201010000OC000000000000endianClass:Data:Version:OS/ABI:ABIVersion:ELF642*scomplement,1(current)UNIX-SystemV0little'聲T
8、ype:CORE(Corefile)Machine:AdvancedMicroDevicesX86-64Version:0x1Entrypointaddress:OxCStartofprogramheaders:64(bytesintofile)Startofsectionheaders:0(bytesintofile)Flags:OxCSizeofthisheader:64(bytes)Sizeofprogramheaders:56(bytes)uaberofprogramheaders:13Sizeof
9、sectionheaders:0(bytes)Numberofsectionheaders:0headerstringtableindex:0从读出来的ELF头信息可以看到,此文件类型为Core文件,那么readelf是如何得知的呢?可以从下面的数据结构中窥得一二:番defineEI^NIDENT16typedefstruct{unsignedchareidentlEINIDENT];^(Elf32
此文档下载收益归作者所有