仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 901|回复: 10
打印 上一主题 下一主题

[其他Linux] Linux编程:Linux上Core Dump文件的构成和剖析仓酷云

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:28:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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”,此文件撑持定制,一样平常利用%共同分歧的字符,这里排列几种:
  1. %p出Core历程的PID
复制代码
  1. %u出Core历程的UID
复制代码
  1. %s形成Core的signal号
复制代码
  1. %t出Core的工夫,从1970-01-0100:00:00入手下手的秒数
复制代码
  1. %e出Core历程对应的可实行文件名
复制代码
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
小妖女 该用户已被删除
沙发
发表于 2015-1-21 07:25:07 | 只看该作者
Windows?是图形界面的,Linux类似以前的?DOS,是文本界面的,如果你运行了图形界面程序X-WINDOWS后,Linux?也能显示图形界面,也有开始菜单、桌面、图标等。
深爱那片海 该用户已被删除
板凳
发表于 2015-1-30 11:05:12 | 只看该作者
Linux的成功就在于用最少的资源最短的时间实现了所有功能,这也是符合人类进化的,相信以后节能问题会日益突出。
小魔女 该用户已被删除
地板
发表于 2015-2-4 20:07:24 | 只看该作者
Linux?最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具,所以Linux操作系统有着广泛的应用空间。
若天明 该用户已被删除
5#
发表于 2015-2-10 05:54:15 | 只看该作者
通过一条缓慢的调制解调器线路,它也能操纵几千公里以外的远程系统。
变相怪杰 该用户已被删除
6#
发表于 2015-2-28 22:06:30 | 只看该作者
其次,Linux简单易学,因为我们初学者只是学的基础部分,Linux的结构体系非常清晰,再加上老师循序渐进的教学以及耐心的讲解,使我们理解起来很快,短期内就基本掌握了操作和运行模式。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-3-2 22:38:12 | 只看该作者
选择一些适于初学者的Linux社区。
谁可相欹 该用户已被删除
8#
发表于 2015-3-11 07:18:16 | 只看该作者
通过自学老师给的资料和向同学请教,掌握了一些基本的操作,比如挂载优盘,编译程序,在Linux环境下运行,转换目录等等。学了这些基础才能进行下面的模拟OS程序。?
飘灵儿 该用户已被删除
9#
发表于 2015-3-11 10:02:02 | 只看该作者
用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户,估shell也称为命令解释器,有关命令的学习可参考论坛相关文章,精通英文也是学习Linux的关键。
再现理想 该用户已被删除
10#
发表于 2015-3-18 04:05:13 | 只看该作者
要增加自己Linux的技能,只有通过实践来实现了。所以,赶快找一部计算机,赶快安装一个Linux发行版本,然后进入精彩的Linux世界,相信对于你自己的Linux能力必然大有斩获。
只想知道 该用户已被删除
11#
 楼主| 发表于 2015-3-25 11:26:17 | 只看该作者
生成新的unispimsp.ksc。”另外得到回复后如果问题解决,向帮助过你的人发个说明,让他们知道问题是怎样解决的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-22 05:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表