调试基础:内存转储

标签: ToolKits GDB | 发表时间:2011-10-16 22:19 | 作者:dutor pipitu
出处:http://www.dutor.net

  core dump, 通常译作内存转储,core之所以译作内存,而不是核心,纯属“著名”的历史原因,因为早期的内存有一个叫磁芯(magnectic core)的东西。内存转储会在磁盘中产生一个文件,是某个进程在转储时刻的内存映像及寄存器等信息。内存转储通常发生在进程执行了有致命错误的指令时,常见的就是著了名的Segmentation fault,即段错误,而导致段错误的就是C/C++编程中经常发生的内存非法访问。内存转储操作由操作系统内核进行。当然,内存转储还可以是用户主动发起请求,内核执行转储。
  内存转储对于程序调试是至关重要的。利用内存转储文件(core files)对程序进行调试是一种异步的静态调试,所谓异步是指异常发生与调试不是在同一时刻,所谓静态指的是core files保存的只是转储时刻进程的内存状态。比如,一个长期运行的服务程序,我们不知道哪里有bug,该bug何时被触发,这种情况下,利用异常发生时的转储文件就可以在一定程度上定位出异常发生的原因。另外,对于非致命性错误,比如死锁或者死循环,进程不会自动结束,通常内核也不会主动杀掉这种进程,这时用户就可以请求内核将该进程进行内存转储,以此来查看进程的运行状态(比如各进程的堆栈)。

使能/生成内核转储

  ulimit -c命令可以查看和控制转储文件允许的生成大小,如果你的程序发生了致命错误却没有被转储,很可能是该值被设为零了。ulimit -c CORESIZE可以将core files所允许的最大值设为CORESIZE,ulimit -c unlimited取消对core files大小的限制,内核为尽量多的转储进程的内存。
  异常发生时,内核会根据设定大小生成转储文件。手动生成转储文件有两种方法,使用gdb attach到目标进程执行generate-core-file(缩写为gcore),但由于attach到进程会导致进程在较长时间内挂起,对某些程序(比如网络程序)会造成不必要的影响,这时使用随gdb一起发布的gcore命令就比较合适了,且更加方便。

1
2
3
4
5
$ pgrep -l foobar
12345    foobar
$ gdb
gdb> attach 12345
gdb> gcore
1
$ gcore `pidof foobar`

控制转储文件的路径和格式

  很多系统中转储文件的默认文件名就是core,这时很难确定它是由哪个进程生成的,且可能导致同目录下多个转储文件的相互覆盖。这时可以在/etc/sysctl.conf文件中定制core文件的格式,比如,

1
2
3
$ cat /etc/sysctl.conf
kernel.core_uses_pid = 1
$ sysctl -p # to take effect

  将kernel.core_uses_pid设为1,core文件就会以core.PID的形式生成。更复杂的格式可以由kernel.core_pattern变量控制。比如,

1
2
3
4
$ cat /etc/sysctl.conf
kernel.core_pattern = %e-%p-%u-%t.core
kernel.core_uses_pid = 0
$ sysctl -p # to take effect

  这时生成的core文件就是EXECUTABLE-PID-UID-TIME.core的形式,将kernel.core_uses_pid设成0是为了将core文件末尾的pid去掉。kernel.core_pattern可以使用的格式字符如下,

格式符 说明
%% %
%p pid
%u uid
%g gid
%s 引发core dump的信号编号
%t 转储时间
%h 主机名
%e 可执行文件名
%c ulimit -c

此外,kernel.core_pattern还可以加上路径前缀,用以使core文件转储到特定的目录。

使用gdb调试内存转储文件

  使用gdb可以方便的查看转储文件,同时还需要进程的可执行文件(包含进程的虚拟地址空间),若想调试时能够查看源代码,  编译可执行文件时需要加上-g调试选项,同时还要有源代码可用(注意:编译器的-g选项并没有把源代码包含到可执行文件中)。
使用gdb调试转储文件的命令为

1
$ gdb EXECUTABLE -c COREFILE

或者

1
$ gdb EXECUTABLE COREFILE

或者

1
2
$ gdb EXECUTABLE
gdb> core COREFILES

  调试core file的具体方法属于gdb的使用问题,之前有一篇我学习gdb时写的总结,也画过一张思维导图,仅供参考。
  另外,像前面说的,利用转储文件进行调试属于静态调试,gdb的很多命令是“无法使用”的,比如i proc mapping。当然更无法进行单步调试。
  另外,转储文件为ELF格式文件,可以使用objdump/readelf等工具查看,但相比动态库、可执行文件等其他ELF二进制文件,它包含的信息是有限的。

相关 [调试 基础 内存转储] 推荐:

调试基础:内存转储

- pipitu - Dutor
  core dump, 通常译作内存转储,core之所以译作内存,而不是核心,纯属“著名”的历史原因,因为早期的内存有一个叫磁芯(magnectic core)的东西. 内存转储会在磁盘中产生一个文件,是某个进程在转储时刻的内存映像及寄存器等信息. 内存转储通常发生在进程执行了有致命错误的指令时,常见的就是著了名的Segmentation fault,即段错误,而导致段错误的就是C/C++编程中经常发生的内存非法访问.

HTTP基础

- - ITeye博客
HTTP的结构主要包括下面几个要点:. HTTP的版本主要有1.0,1.1 和更高版本.    1.1 及以上版本允许在一个TCP连接上传送多个HTTP协议,1.0能 .    1.1 及以上版本多个请求和响应可以重叠,1.0不能.    1.1 增加了很多的请求头和响应头.     一个请求行,若干小心头,以及实体内容,其中的一些消息头和实体内容是可选的,消息头和实体内容需要空行隔开.

Git基础

- Wolf - 潘魏增
上个月末在公司内部作了一次《Git基础》的主题分享. 这里把分享内容公布出来,希望对一些朋友有用. 如果之前没有接触过Git,wikipedia上面已经有非常好的介绍. pdf格式:http://panweizeng.com/download/git-basics-meituan.pdf. keynote格式:http://panweizeng.com/download/git-basics-meituan.key.

JavaScript 基础

- - CSDN博客推荐文章
JavaScript可以出现在HTML的任意地方,甚至在之前插入也不成问题,使用标签. 不过要在框架网页中插入的话,就一定要在之前插入,否则不会运行. JavaScript对数据类型要求不严格,一般来说,声明变量的时候不需要声明类型,而且就算声明了类型,在使用过程中也可以给变量赋予其他类型的值,声明变量使用var关键字.

CSS基础

- - CSDN博客Web前端推荐文章
1、引入CSS的四种方式. 行内样式、内嵌样式、链接样式、导入样式. 基本选择器:标签选择器,ID选择器,类选择器,通用选择器. 通用选择器:*{css代码}. 通用选择器作用:对整个网页中所有HTML标签进行样式定义. 常见用法:定义*{margin:0;padding:0}通用样式,并置于CSS文件最顶端,用于对HTML内所有的标签进行重置以保证页面能兼容多种浏览器.

友情的基础

- okici - 比特客栈的文艺复兴
央视对百度的炮轰持续数日后突然停歇,让人揣测百度公关是不是已经与央视签好了互不侵犯协议. 有网友把cntv.baidu.com与baidu.cntv.cn两个域名翻出来奉为定情信物,只可惜它们都是过时的信号. “百度台”与其域名已经存在很久,是Google没叫板之前两家公司的蜜月记忆,早就流失于骂战的口水中.

css基础入门

- - CSDN博客推荐文章
css是Cascading Style Sheets的缩写,是一种用于为Html文档定义布局的样式表语言. Css是一种样式表语言,用于为html定义布局. Css弥补了Html对标记属性控制的不足. Css将网页内容与样式实现分离,使得网页设计更加明了、简洁. Css可以精确控制网页布局,如行间距、字间距、段落缩进和图片定位等.

java基础知识

- - CSDN博客互联网推荐文章
JAVA相关基础知识. 1、面向对象的特征有哪些方面. 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面. 抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节. 抽象包括两个方面,一是过程抽象,二是数据抽象. 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.

CSS基础学习

- - CSDN博客推荐文章
1.    CSS基础介绍:. (1)      CSS的作用:兼容、实现了将页面内容与页面表现相分离. (2)      当文档中的某一元素被多处样式定义时,究竟会使用那个样式呢.                 内联样式--->内部样式表--->外部样式表--->浏览器缺省设置. 2.    CSS基础语法与高级语法:.