coredump+gdb调试

1、什么是coredump

Coredump(核心转储)是操作系统在程序异常终止(例如由于段错误或其他严重错误)时创建的一种文件。这个文件包含了程序崩溃时刻进程的内存镜像,通常还包括程序计数器、寄存器内容和堆栈内存等信息,文件比较大。Coredump 文件的主要用途是帮助开发者在程序崩溃后进行调试,以确定导致崩溃的原因。

2、linux常见造成coredump的信号

  1. SIGQUIT (3):用户通过Ctrl+\发送的退出信号,通常会导致程序终止并生成core dump
  2. SIGILL (4):执行非法指令时发生,如尝试执行非法的机器语言指令或者损坏的代码,通常会导致程序终止并生成core dump
  3. SIGTRAP (5):由断点或其他陷阱触发的信号,常在调试过程中使用,会导致程序终止并生成core dump
  4. SIGABRT (6):由abort()系统调用产生,通常用于处理严重错误(如断言失败),导致程序终止并生成core dump
  5. SIGFPE (8):发生致命的算术错误,例如除以零或算术溢出等,通常会导致程序终止并生成core dump
  6. SIGSEGV (11):无效的内存引用或段错误,例如访问未分配的内存,通常会导致程序终止并生成core dump
  7. SIGBUS (7):硬件故障导致的无效内存访问,如对齐错误等,通常会导致程序终止并生成core dump
  8. SIGSYS (31):非法的系统调用,通常会导致程序终止并生成core dump。

3、调试 步骤

3.1 生成coredump文件

// 查看core文件储存位置
$ cat /proc/sys/kernel/core_pattern

在这里插入图片描述

// 临时更改路径:
$ echo '/path/to/coredumps/core.%e.%p.%h.%t' | sudo tee /proc/sys/kernel/core_pattern
// 这里的/path/to/coredumps/是你希望存放core dump文件的目录。%e、%p、%h、%t是可选的格式化选
// 项,分别代表可执行文件的名称、进程ID、主机名和时间戳。// 永久更改路径
// 永久更改需要编辑/etc/sysctl.conf文件,或者在/etc/sysctl.d/目录下创建一个新文件。
// 在文件中添加或修改以下行
$ kernel.core_pattern=/path/to/coredumps/core.%e.%p.%h.%t
// 然后运行以下命令来应用更改
$ sudo sysctl -p

注意:不建议永久更改,临时操作完后,即能恢复原来状态

3.2 更改生成文件大小

// 查看当前限制:运行 ulimit -a 会显示所有的资源限制。
$ ulimit -a

在这里插入图片描述

// ulimit -c [size]
// size 单位为KB
// 要将 core dump 限制设置为无限制,可以运行:
$ ulimit -c unlimited

3.3 准备崩溃程序

测试程序名:test
// 头文件 widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void do_it();private:Ui::Widget *ui;
};
#endif // WIDGET_H

// 源文件 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <stdio.h>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::do_it()
{//定义一个字符指针变量a,指向地址1.这个地址肯定不是自己可以访问的,但是这行不会产生段错误。char* p="1";//视图更改地址1出的值,内核会终止该进程,并把core文件dump出来。*p='a';
}

// 主程序 main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.do_it();w.show();return a.exec();
}

使用debug编译,生成可执行程序:

// 执行该程序,出现段错误,并在相应目录下生成core文件
$ sudo ./test

在这里插入图片描述
在这里插入图片描述
注意:确认文件是不是core文件方法
在这里插入图片描述

3.4 gdb调试崩溃程序

// 使用gdb调试
$ sudo gdb test /path/to/coredumps/core.%e.%p.%h.%t

在这里插入图片描述

3、gdb调试基本指令

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/336720.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于模块自定义扩展字段的后端逻辑实现(一)

目录 一&#xff1a;背景介绍 二&#xff1a;实现过程 三&#xff1a;字段标准化 四&#xff1a;数据存储 五&#xff1a;数据扩展 六&#xff1a;表的设计 一&#xff1a;背景介绍 最近要做一个系统&#xff0c;里面涉及一个模块是使用拖拉拽的形式配置模块使用的字段表…

bilibi分类id的秘密

问题 今天想通过rss来阅读bilibili的相关信息&#xff0c;但是如何获取排行榜的分类呢&#xff1f;研究了一下。 办法 浏览器最喜欢的F12&#xff0c;过滤关键才v2?rid,后面的数字就是分类id。 rss获取路径 [最后的数字是0&#xff0c;是所有投稿&#xff0c;数字是1的话是…

失去记忆的朱令对父亲说:如果你不照顾我,就再也没有人可以了

这句话深深触动了朱父和朱母&#xff0c;他们最害怕的就是&#xff1a;除了他们&#xff0c;还有谁会如此细心地照料女儿&#xff1f;他们担心有一天女儿苏醒&#xff0c;他们却无法再支撑自己。 这样的苦难并没有击垮两位老人&#xff0c;时间的流逝是最无情的。随着年岁的增长…

LabVIEW在微生物检测中的应用

随着对食品安全关注的增加&#xff0c;食品检测的准确性变得越来越重要。其中&#xff0c;微生物计数作为食品合格的关键指标&#xff0c;对其检测技术的准确性和实时性要求极高。传统的微生物检测面临着菌落识别困难、设备实时性差和自动化程度不高等问题&#xff0c;尤其在疫…

K8S的存储卷---数据卷

容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的。delete&#xff0c;K8S用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会恢复到初始状态。一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消失 容器和节点之间创建一个…

螺旋数字矩阵 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m (0 < n <= 999,0 < m <= 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3……

sqrt(1./x)和sqrt(1.0/x)得到的结果不同 matlab

原因&#xff08;from chatgpt&#xff09;&#xff1a; MATLAB中的两个表达式 sqrt(1.0/lamda) 和 sqrt(1./lamda) 的区别在于它们如何处理数组和数据类型。 sqrt(1.0/lamda)&#xff1a; 这里的 1.0 被视为一个标量的双精度浮点数。当执行 1.0/lamda 时&#xff0c;MATLAB…

java解析json复杂数据的两种思路

文章目录 一、原始需求二、简单分析三、具体实现一1. api接口2. 接口返回3. json 数据解析1.&#xff09;引入Jackson库2.&#xff09;定义实体3.&#xff09;解析json字符串4.&#xff09;运行结果 4. 过程分析 四、具体实现二1. 核心代码2.运行结果 五、方案比较六、源码传送…

【C语言】time.h——主要函数介绍(附有几个小项目)

time.h是C标准函数库中获取时间与日期、对时间与日期数据操作及格式化的头文件。返回值类型 size_t&#xff1a;适合保存sizeof的结果&#xff0c;类型为unsigned int&#xff08;%u&#xff09;clock_t&#xff1a;适合存储处理器时间的类型&#xff0c;一般为unsigned long&…

将dumpbin从Visual Studio中抠出来,并使用dumpbin查看exe和dll库的依赖关系

目录 1、初步说明 2、在开发的机器上使用dumpbin工具查看dll库的依赖关系 3、将dumpbin.exe从Visual Studio中抠出来 3.1、找到dumpbin.exe文件及其依赖的dll文件 3.2、在cmd中运行dumpbin&#xff0c;提示找不到link.exe文件 3.3、再次运行dumpbin.exe提示找不到mspdb10…

Python教程38:使用turtle画动态粒子爱心+文字爱心

Turtle库是Python语言中的一个标准库&#xff0c;它提供了一种有趣的方式来介绍编程和图形绘制的基本概念。Turtle库使用一个虚拟的“海龟”来绘制图形。你可以控制海龟的方向、速度和位置&#xff0c;通过向前移动、向左转或向右转等命令来绘制线条、圆弧多边形等图形。 -----…

LeetCode 36 有效的数独

题目描述 有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考…