当前位置: 首页 > article >正文

Linux 使用gdb调试core文件

core文件和gdb调试

  • 什么是 core 文件?
  • 产生core文件的原因?
  • core 文件的控制和生成路径
  • gdb 调试core 文件
  • 引用和拓展

什么是 core 文件?

当程序运行过程中出现Segmentation fault (core dumped)错误时,程序停止运行,并产生core文件。core文件是程序运行状态的内存映象。

产生core文件的原因?

当程序访问的内存超出了系统给定的内存空间,就会产生Segmentation fault (core dumped),core dumped又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中。
段错误产生的情况主要有:
(1)访问不存在的内存地址。
(2)访问系统保护的内存地址。
(3)数组访问越界等。

使用gdb调试core文件,可以帮助我们快速定位程序出现段错误的位置。

core 文件的控制和生成路径

怎麽查看core文件是否生成呢?

  • 使用ulimit -c命令,若结果为0,表示关闭core 文件生成。
    在这里插入图片描述
    其次,core文件的大小是可以控制的,使用ulimit -c FileSize可以指定core 文件的生成大小,当core文件的大小超过FileSize时,core将被裁剪(裁剪发生在 Core 文件写入磁盘时,由内核控制)。
    Core 文件被裁剪的影响: 如果程序生成的 Core 文件超过了限制,在使用 gdb 加载该 Core 文件时,可能会出现以下错误提示:
    "Core file is truncated: expected core file size >= XXXX, found: 1024"
    

怎麽修改core 文件大小不受限制?

  1. ulimit -c unlimited: 临时修改core文件大小不受限制。(服务器重启该命令无效)

  2. 永久修改(谨慎使用):
    方法1: 在/etc/rc.local文件追加一行ulimit -c unlimited在这里插入图片描述
    方法2:在/etc/profie文件追加一行ulimit -c unlimited
    方法3:在/etc/security/limits.conf 加入以下命令

    @root soft core unlimited
    @root hard core unlimited
    

core 文件的命名格式和生成路径?

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

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

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

  • /proc/sys/kernel/core_pattern:可以设置格式化的core文件保存的位置和文件名,比如原来文件内容是core-%e。 可以这样修改: echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern 将会控制所产生的core文件会存放到/corefile目录下,产生的文件名为:core-命令名-pid-时间戳。

以下是参数列表:
(1)%p - insert pid into filename (添加pid)
(2)%u - insert current uid into filename (添加当前uid)
(3)%g - insert current gid into filename (添加当前gid)
(4)%s - insert signal that caused the coredump into the filename (添加导致产生core的信号)
(5)%t - insert UNIX time that the coredump occurred into filename (添加core文件生成时的unix时间)
(6)%h - insert hostname where the coredump happened into filename (添加主机名)
(7)%e - insert coredumping executable name into filename (添加命令名)
一般情况下,无需修改,按照默认的方式即可。
核心组件总结
信号处理:进程收到致命信号时触发 Core 文件生成。
内核控制:内核根据 ulimit 设置决定是否裁剪 Core 文件。
文件系统写入:Core 文件内容写入磁盘时按限制裁剪。

gdb 调试core 文件

为了做一个简单的测试,我们不妨写一个具有段错误的程序,如下:

#include <stdio.h>

int main()
{
    int *ptr = NULL; // 定义一个空指针
    *ptr = 42;       // 尝试解引用空指针,触发段错误
    return 0;
}
  • 设置core文件限制为unlimited.
    在这里插入图片描述
  • gcc 编译该程序,运行程序,并生成调试信息和 core 文件,方便下一步。 在这里插入图片描述
  • 查看当前目录及core文件大小。
    在这里插入图片描述
  • 使用gdb调试,使用bt或者where锁定问题。
    在这里插入图片描述

引用和拓展

  • Linux下使用gdb 调试core.博客园
  • Linux下gdb用法介绍
  • 一篇文章轻松学会使用gdb调试程序的core文件

http://www.kler.cn/a/406666.html

相关文章:

  • 分层架构 IM 系统之架构演进
  • RTL8211F 1000M以太网PHY指示灯
  • springboot:责任链模式实现多级校验
  • 【课堂笔记】隐私计算实训营第四期:“隐语”可信隐私计算开源框架
  • 网络安全,文明上网(6)网安相关法律
  • c语言学习23数组传递到子函数
  • vpc云网络如何构建(理论篇)
  • 【数据分享】中国住户调查年鉴(2000-2024) PDF
  • 【Unity3D插件】Unity3D HDRP Outline高亮发光轮廓描边插件教程
  • Flutter:SlideTransition位移动画,Interval动画延迟
  • 基于SpringBoot实现的在线课程管理系统(代码+论文)
  • 科技部的国家一级资质科技查新机构有哪些?
  • 第 28 章 - Go语言 Web 开发入门
  • android 使用MediaPlayer实现音乐播放--基础介绍
  • Devexpress.Dashboard的调用二义性
  • GaussDB 华为高斯数据库
  • macos 使用 nvm 管理 node 并自定义安装目录
  • 超越GPT-4o-mini | 北大开源「国产o1」大模型,{多阶段自主推理}让小模型也能“放大招“!
  • 香港站群服务器有助于提升网站在搜索引擎中的排名
  • QT设置MessageBox的大小
  • fastadmin实现站内通知功能
  • [数组双指针] 0167. 两数之和 II - 输入有序数组
  • 为什么芯麦的 GC4931P 可以替代A4931/Allegro 的深度对比介绍
  • Android开发实战班-Android App 的启动过程
  • 分布式系统稳定性建设-性能优化篇
  • 【大数据学习 | Spark-Core】yarn-client与yarn-cluster的区别