linux 下 core 相关知识总结

在以往的测试过程中,每当遇到程序出现 coredump 的状况,我的第一反应就是有 bug,让开发定位原因,但是如果自己能够去挖掘原因,在与开发沟通的过程中能明确指出问题所在,一定能提高沟通,定位问题的效率。

最近利用空余时间学习了一下 core 的基本知识,发现有很多新的发现(其实是自己以前不知道,呵呵),在这里分享给大家,希望对大家有所帮助。

1. core 文件的简单介绍

在一个程序崩溃时,它一般会在指定目录下生成一个 core 文件,core 文件包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等,可以帮助我们进行调试。

2. 造成 coredump 的常见原因

  • 内存访问越界
  • 多线程程序使用了线程不安全的函数
  • 多线程读写的数据未加锁保护
  • 非法指针
  • 堆栈溢出

3. core 文件的生成开关和大小限制

使用 ulimit –c 命令可查看 core 文件的生成开关,若结果为0,则表示关闭了此功能,不会生成 core 文件。

  • 使用 ulimit –c filesize 命令,可以限制 core 文件的大小,如果此文件大小超过限制,将会被裁剪,最终生成不完整的 core 文件。若为 ulimit –c unlimited ,则不限制 core 文件的大小。 注意:在测试前需检查 core 文件的开关是否打开;在测试过程中发现程序异常退出,但没有产生 core ,我们也需要第一时间检查 core 文件是否打开;有几种方式让程序产生 core 。
  • 修改 core 文件生成大小的配置,例如 ulimit –c 1000,这个修改只对当前会话有效。
  • 通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件,如 ~/.profile ,例如在wx用户下的 ~/.profile 增加 ulimit –c unlimited ,那么对于 wx 用户就可以生成没有大小限制的 core 文件,但是对于其他用户不生效。
  • 修改 /etc/profile 文件,将默认配置 # ulimit -Sc 0 ,将配置改成可用,并设置为 ulimit -Sc unlimited ,那么该机器的所有用户都将生成无大小限制的 core 文件。
  • 在程序的启动脚本(例如 restart.sh )的开头设置 ulimit –c unlimited ,这只是对该进程有用。

4. core 文件的名称和生成路径设置

若系统生成的 core 文件不带其他任何扩展名称,则全部命名为 core,新的 core 文件生成将会覆盖原来的 core 文件。

/proc/sys/kernel/ core_uses_pid 可以控制 core 文件的文件名是否添加 pid 作为扩展。文件内容为1表示添加 pid ,生成的 core 文件格式为 core.XXXX ,为0表示不添加。可以通过以下命令修改此文件: echo “1”> /proc/sys/kernel/ coreuses_pid

/proc/sys/kernel/ core_pattern可以控制 core 文件保存位置和文件名格式。可以通过以下命令修改此文件:

echo “/corefile/core-%e-%p-%t”> core_pattern,可以将 core 文件统一生成到 / corefile 目录下,产生的文件名为 core - 命令名 - pid - 时间戳,以下是参数列表:

%p表示添加pid;

%u表示添加当前uid;

%g表示添加当前gid;

%s表示添加导致产生core的信号;

%t表示添加core文件生产时的unix时间;

%h表示添加主机名;

%e表示添加命令名;

5. 如何查看 core 文件

如果我们不清楚 core 是由哪个进程产生的,我们可以通过使用命令 “ file core 文件 ”来查看。

例如 core 文件是由 test 这个进程产生的,那么通过命令 “ gdb test corefile ” 查看 core 文件的内容,在输入 bt 或 where 检查程序运行到哪里,来定位 coredump 的行。

我们查看一个core的例子,例如getd在启动时出现了 core,内容为:

我们可以看到在 getdapp.cpp 的1108行调用 assert 函数出现错误,从而抛出了信号,产生了 core 。

core 显示的内容为堆栈信息,我们可以通过输入 up 来查看上一层堆栈的信息,例如:我们最初看到 core 文件信息为:

连续输入 up 后,显示内容为:

6. gdb 常用命令

有些 core 能简单的定位出,但是有些 core 文件的定位还需要了解 gdb 常用的命令,通过这些命令与 core 文件结合,我们才能快速定位出问题。下面简单的介绍一下 gbd 常用的命令:

l:相当于list,从第一行开始列出原码;

回车:表示重复上一次命令;

P:print的缩写,打印变量的值,格式为P 变量名;

break:设置断点,例如break 22表示在22行设置断点,break test表示在test函数入口处设置断点;

info break:查看断点信息;

r:表示运行程序;

c:继续运行程序;

n:next的缩写,表示单步运行;

bt:查看函数堆栈;

finish:退出函数;

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

易惠芳的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Linux系统命令和使用技巧8则

我们在平时使用 Linux 系统时,无论在终端下还是在图形桌面下,都有一些快捷的命令和操作的技巧,本文就向新手简单介绍常用的几种: 1、处理特殊的文件名 假设L...

3938
来自专栏SpringBoot 核心技术

第十一章:实现SpringBoot单个、多个文件的上传本章目标构建项目总结

1672
来自专栏散尽浮华

分布式监控系统Zabbix--完整安装记录 -添加web页面监控

通过zabbix做web监控,不仅仅可以监控到站点的响应时间,还可以根据站点返回的状态码或响应时间做报警设置,比如说对某个url进行监控,当访问返回的状态码是非...

1929
来自专栏青青天空树

node调用phantomjs-node爬取复杂页面

phantomjs官网是这么说的,‘整站测试,屏幕捕获,自动翻页,网络监控’,目前比较流行用来爬取复杂的,难以通过api或正则匹配的页面,比如页面是通过异步加载...

611
来自专栏运维小白

Linux基础(day5)

2.1/2.2 系统目录结构 2.3 ls命令 2.4 文件类型 2.5 alias命令 2.1/2.2 系统目录结构 ls (全称list) 用来列取目录和...

1988
来自专栏我的博客

同步文件Rsync命令

环境 A:10.200.11.224 B:10.200.11.230 需求:将A机器上文件推送到B机器 将A机器的pubkey添加到B机器authori...

41010
来自专栏小狼的世界

Rsync服务介绍与配置

rsync 是一个用于增量文件传输的开源工具,不得不说,rsync简直是不同服务器间传输文件、同步文件的利器。与FTP相比,它具有非常简单的安装和配置方法。而且...

1062
来自专栏云计算教程系列

如何在Debian 8上将log日志模块添加到Nginx

服务器管理不仅仅与服务的初始配置有关。它还涉及监督这些服务并确保它们尽可能顺利地运行。管理员最重要的知识来源之一是log日志文件,其中包含有关系统事件的信息。

921
来自专栏Petrichor的专栏

搜索指令

find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。 与查询数据库(/var/lib/locatedb)文件不同,find查找的是磁盘空间。

732
来自专栏LIN_ZONE

macOS apache配置及开启虚拟服务器的开启,apache开启重写模式

今天把自己的mac系统升到最新版,但是,apache却不能用了,因为mac上的apache是系统自带的,因为是mac目前的最新系统,所以出现了好多问题,整理了一...

704

扫码关注云+社区