Linux 下使用 gdb 调试 core 文件

1.core文件

当程序运行过程中出现段错误(Segmentation Fault),程序将停止运行,由操作系统把程序当前的内存状况存储在一个 core 文件中,即核心转储文件(Coredump File),core 文件是程序运行状态的内存映象。

之所以将程序运行状态存为名为 core 的文件,因为 core 意指 core memory,用线圈做的内存。如今,半导体工业澎勃发展,已不再使用 core memory 了,不过,在许多情况下,人们还是把记忆体叫作 core 。

使用 gdb 调试 core 文件,可以帮助我们快速定位程序出现段错误的位置。当然,可执行程序编译时应加上 -g 编译选项,生成调试信息。

当程序访问非法内存会产生段错误,产生段错误的常见情况有:
(1)访问不存在的内存地址;
(2)访问系统保护的内存地址;
(3)数组访问越界等。

2.控制 core 文件是否生成

(1)使用 ulimit -c 命令可查看生成 core 文件的最大大小,若结果为 0,则表示不会生成 core文件。

( 2) 使用 ulimit -c FILESIZE 命令,可以限制 core 文件的大小(FILESIZE 单位为 KB)。如果生成的信息超过此大小,将会被截断,最终生成一个不完整的 core 文件。在调试此 core 文件的时候,gdb 会提示错误。比如:ulimit -c 1024。

(3)使用 ulimit -c unlimited,则表示 core 文件的大小不受限制。

在终端通过命令ulimit -c unlimited只是临时修改,重启后无效 ,要想永久修改有三种方式:
(1)在/etc/rc.local 中增加一行 ulimit -c unlimited;
(2)在/etc/profile 中增加一行 ulimit -c unlimited;
(3)在/etc/security/limits.conf 最后增加如下两行记录:

@root soft core unlimited
@root hard core unlimited

3.控制 core 文件的名称和生成路径

core 默认的文件名称是 core.pid,pid 指的是产生段错误的程序的进程号。默认路径是产生段错误的程序的当前目录。

如果想修改 core 文件的名称和生成路径,相关的配置文件为:

/proc/sys/kernel/core_uses_pid
	用于控制产生的 core 文件的文件名中是否添加 pid 作为扩展,如果添加则文件内容为 1,否则为 0

/proc/sys/kernel/core_pattern
	可以设置 core 文件保存的位置和名称。比如 echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern,
所产生的 core 文件会存放到 /corefile 目录下,产生的文件名为:core-命令名-pid-时间戳

以下是参数列表:

%p - insert pid into filename 添加 pid
%u - insert current uid into filename 添加当前 uid
%g - insert current gid into filename 添加当前 gid
%s - insert signal that caused the coredump into the filename 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名

一般情况下,无需修改,按照默认的方式即可。

4.使用 gdb 调试 core 文件的步骤

使用 gdb 调试 core 文件来查找程序中出现段错误的位置时,要注意的是可执行程序在编译的时候需要加上 -g 编译命令选项。

gdb 调试 core 文件的步骤也比较简单,步骤如下:
(1)启动 gdb,同时指定程序与 core 文件。

gdb EXEFILE COREFILE

#或
gdb -c | --core COREFILE EXEFILE

#或
gdb COREFILE
file EXEFILE

(2)在进入 gdb 后,查找段错误位置,使用 where 或者bt。
这里写图片描述
可以定位到源程序中具体文件的具体位置,出现了段错误。

5.其它查找段错误位置的方法

可以使用 gdb 进行单步调试,来查找段错误出错的位置。gdb 的用例具体见:
Linux 下 gdb 用法简单介绍


参考文献

[1] Linux core 文件介绍
[2] 百度百科.核心转储

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值