[C/C++] -- gdb调试与coredump

news2024/11/25 2:53:22

1.gdb调试

GDB(GNU 调试器)是一个强大的工具,用于调试程序。

安装

1.  wget http://ftp.gnu.org/gnu/gdb/gdb-8.1.tar.gz

2.   tar -zxvf gdb-8.1.1.tar.gz

3.   cd gdb-8.1.1

4.  ./configure

5.  make

6.  make install

基础用法

启动GDB

gdb <executable>

基本调试命令

run [args]:运行程序并可选地传递参数

run arg1 arg2

break [location]:在指定位置设置断点。位置可以是函数名、文件:行号、内存地址等。

break main
break myfile.c:10

delete [breakpoint-num]:删除指定断点,若不指定,则删除所有断点。

delete 1
delete

info breakpoints:显示所有断点的信息。

info breakpoints

continue (c):继续执行程序直到下一个断点或程序结束。

continue

next (n):单步执行下一行代码,不进入函数内部。

next

step (s):单步执行下一行代码,如果是函数调用,则进入函数内部。

step

finish:继续执行直到当前函数返回。

finish

检查程序状态

print [expression]:打印表达式的值。

print x
print my_array[0]

display [expression]:每次停止时显示表达式的值。

display x

undisplay [display-num]:取消自动显示某个表达式。

undisplay 1

info locals:显示当前堆栈帧中所有局部变量的值。

info locals

info args:显示当前堆栈帧中所有参数的值。

info args

堆栈操作

backtrace (bt):显示当前调用堆栈。

backtrace

frame [frame-num]:切换到指定的堆栈帧。

frame 2

up [n]:向上移动n个堆栈帧,默认为1。

up 1

down [n]:向下移动n个堆栈帧,默认为1。

down 1

内存操作

x/nfu [address]:检查内存地址。n是要显示的单位数,f是格式(x=hex,d=decimal,u=unsigned decimal,o=octal,t=binary,a=address,c=char,s=string),u是单位(b=bytes,h=halfwords,w=words,g=giant words)。

x/4xw 0x600d90
x/s 0x600d90

修改变量

set var [variable] = [value]:设置变量的值。

set var x = 10
set var my_array[0] = 20

程序控制

kill:终止正在调试的程序。

kill

quit:退出GDB。

quit

其它有用命令

list [location]:显示源代码。location可以是函数名、文件:行号、内存地址等。

list main
list myfile.c:10

info functions:显示所有已知的函数。

info functions

info variables:显示所有已知的全局和静态变量。

info variables

调试用例

#include <iostream>
using namespace std;

void printArray(int *arr, int size) {
    for(int i = 0; i < size; ++i) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    printArray(arr, 5);

    //bug: 超出数组索引
    cout << arr[10] << endl;

    return 0;
}

编译和启动GDB

设置断点并运行程序

在GDB中,首先设置一个断点并运行程序:

单步执行代码

使用 next 命令单步执行代码:

打印变量的值

使用 print 命令检查变量的值:

注意到 arr[10] 是未定义的行为,它可能会显示随机值。

继续执行程序

(gdb) continue
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x00000000004006d6 in main () at main.cpp:14
14        cout << arr[10] << endl;

程序崩溃在访问 arr[10] 时,导致段错误。

检查堆栈

使用 backtrace 命令检查调用堆栈:

(gdb) backtrace
#0  0x00000000004006d6 in main () at main.cpp:16

退出GDB

调试完成后,可以使用 quit 命令退出GDB:

(gdb) quit

2.Coredump调试

Coredump 是计算机系统中的一种文件,用于在程序崩溃时保存程序的内存状态、寄存器值和其他相关信息。

什么是 Coredump

  • 定义:Coredump 是一个包含程序在崩溃时内存状态的文件。它记录了程序的堆栈、堆、全局和静态变量等内容。
  • 用途:主要用于调试和分析程序崩溃的原因,帮助开发者确定问题的根源。

生成 Coredump

  • 配置系统:在 Linux 系统中,通过设置系统参数可以控制是否生成 Coredump 文件及其存放位置。
    • 查看和设置 coredump 文件大小限制:ulimit -c
    ulimit -c unlimited  # 允许生成 coredump 文件
    

    sh

    • 配置 Coredump 文件的存放路径:修改 /etc/sysctl.conf 文件或使用 sysctl 命令
      • 重启服务或系统以应用新的配置。

    sh

    echo "/path/to/store/corefile/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern

分析 Coredump

  • GDB 调试工具:GDB 是一个强大的调试工具,可以用于加载和分析 Coredump 文件。
    gdb /path/to/executable /path/to/corefile
    
  • 基本命令
    • bt (backtrace):显示调用栈,帮助确定程序崩溃的位置。
    • info registers:查看寄存器的值。
    • list:显示源代码。
    • print:打印变量值。
    • quit:退出 GDB。

实际示例

假设有一个简单的 C++ 程序崩溃并生成了 Coredump 文件:

代码示例
#include <iostream>

int main() {
    int *p = nullptr;
    *p = 10;  // 这行会导致程序崩溃(Segmentation fault)
    return 0;
}
编译和运行
g++ -g -o test_program test_program.cpp  # 使用 -g 选项编译以包含调试信息
ulimit -c unlimited  # 允许生成 coredump 文件
./test_program  # 运行程序,导致崩溃并生成 coredump 文件
使用 GDB 分析 Coredump
gdb ./test_program core

在 GDB 中可以使用以下命令进行分析:

(gdb) bt  # 显示调用栈
(gdb) info registers  # 查看寄存器的值
(gdb) list  # 显示出错位置的源代码
(gdb) print p  # 打印指针 p 的值

其他工具和方法

  • coredumpctl:在现代 Linux 系统中,systemd 提供了 coredumpctl 工具来管理和分析 Coredump 文件。
    coredumpctl list  # 列出所有 coredump
    coredumpctl info <PID>  # 显示特定 coredump 的信息
    coredumpctl gdb <PID>  # 使用 gdb 分析特定 coredump
    

预防和改进

  • 代码审查和测试:通过严格的代码审查和测试,尽早发现和修复潜在的问题。
  • 静态分析工具:使用静态分析工具如 clang-tidycppcheck 等,可以在编译阶段发现潜在的崩溃问题。
  • 动态分析工具:如 valgrind 可以在运行时检测内存泄漏和非法内存访问。

通过这些步骤和工具,开发者可以有效地分析和调试程序崩溃,提升程序的稳定性和可靠性。

3.联系

GDB:GDB 是一个强大的调试工具,允许开发者在程序运行时或在程序崩溃后进行交互式调试。

使用场景:

  • 实时调试:在开发过程中,通过设置断点、单步执行等方式调试代码。
  • 分析 Coredump 文件:在程序崩溃后,使用 Coredump 文件分析崩溃原因。

Coredump:Coredump 是程序崩溃时生成的一个文件,记录了程序在崩溃时的内存状态、寄存器值等信息。

使用场景:

  • 崩溃分析:在生产环境中,程序崩溃后可以生成 Coredump 文件,开发者下载后进行离线分析。
  • 长时间运行的程序:对于难以重现的崩溃,通过 Coredump 文件捕捉崩溃时的状态进行分析。
  • 关联

    • GDB 可以加载和分析 Coredump 文件,帮助开发者查看崩溃时的调用栈、变量值和内存状态。
    • 两者结合使用时,GDB 提供了强大的交互式工具,使得分析 Coredump 文件更加高效。
  • 区别

    • 性质不同:GDB 是一个调试工具,而 Coredump 是一个文件。
    • 生成时机不同:GDB 在程序运行时或崩溃后使用,Coredump 在程序崩溃时自动生成。
    • 使用方式不同:GDB 需要开发者交互操作进行调试,Coredump 是自动生成的静态文件,需借助工具(如 GDB)进行分析。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot的非物质文化遗产管理系统-计算机毕业设计源码16087

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

图书管理系统(持久化存储数据以及增添新功能)

目录 一、数据库表设计 二、引入MyBatis 和MySQL 驱动依赖 三、配置数据库 & 日志 四、Model创建 五、枚举类 常量类用户登录 六、用户登录 七、添加图书 八、图书列表 九、修改图书 十、删除图书 十一、批量删除 十二、强制登录 十三、前端代码 &#xff0…

【C语言】bool 关键字

在C语言中&#xff0c;bool类型用于表示布尔值&#xff0c;即真或假。C语言本身在标准库中并未提供布尔类型&#xff0c;直到C99标准引入了stdbool.h头文件。该头文件定义了bool类型&#xff0c;以及两个常量&#xff1a;true和false。在此之前&#xff0c;通常使用整数来表示布…

6.8应用进程跨网络通信

《计算机网络》第7版&#xff0c;谢希仁 理解socket通信

初入Node.js必备知识

Node.js因什么而生&#xff0c;作用是干什么&#xff1f; Node.js是一个用c和c打造的一个引擎&#xff0c;他能够读懂JavaScript&#xff0c;并且让JavaScript能够和操作系统打交道的能力 JavaScript 原本只能在浏览器中运行,但随着Web应用程序越来越复杂,仅靠客户端JavaScri…

35 智能指针

目录 为什么需要智能指针&#xff1f;内存泄露智能指针的使用及原理c11和boost中智能指针的关系RAII扩展学习 1. 为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内存方面的问题&#xff1f; int div() {int a, b;cin >> a >> b;if (…

AutoPSA的应力加强系数

GD2000里的直连三通的应力加强系数是错误的&#xff0c;建议用户删除再使用。 当应力加强系数为空的时候&#xff0c;psa是会自已计算应力加强系数&#xff1b;当用户填了加强系数&#xff0c;软件就优先用填了的加强系数&#xff1b; 直连三通和假三通的作用一样&#xff0c…

JAVA医院绩效考核系统源码:绩效考核的重要性、绩效管理分配实践具体实操,基于B/S架构开发的一套(公立医院绩效考核系统源码)

JAVA医院绩效考核系统源码&#xff1a;绩效考核的重要性、绩效管理分配实践具体实操&#xff0c;基于B/S架构开发的一套&#xff08;公立医院绩效考核系统源码&#xff09; 系统开发环境 开发语言&#xff1a;java 技术架构&#xff1a;B/S架构 开发工具&#xff1a;maven、…

C++基础(五):类和对象(上)

从今天开始&#xff0c;我们正式进入面向对象编程&#xff0c;这是C与C语言的重要区别&#xff0c;编程思想发生变化&#xff0c;那到底什么是面向对象编程呢&#xff1f;接下来&#xff0c;我们慢慢的深入学习。 目录 一、面向过程和面向对象初步认识 1.1 面向过程 1.2 面…

[激光原理与应用-97]:激光焊接焊中检测系统系列介绍 - 1 - 什么是焊接以及传统的焊接方法

目录 一、什么是焊接 1.1 概述 1.2 基本原理 二、传统的焊接技术与方法 2.1 手工电弧焊&#xff1a; 1、定义与原理 2、特点 3、焊条类型 4、应用领域 5、安全注意事项 2.2 气体保护焊&#xff1a; 1、原理与特点 2、应用领域 3、气体选择 4、注意事项 2.3 电阻…

Zabbix 配置PING监控

Zabbix PING监控介绍 如果需要判断机房的网络或者主机是否正常&#xff0c;这就需要使用zabbix ping&#xff0c;Zabbix使用外部命令fping处理ICMP ping的请求&#xff0c;在基于ubuntu APT方式安装zabbix后默认已存在fping程序。另外zabinx_server配置文件参数FpingLocation默…

layui中添加上下文提示弹窗

<p context-tip"自定义上下文提示信息">段落内容...</p> <div context-tip"自定义上下文提示信息">div内容...</div>// 悬浮提示 $("body").on("mouseenter", "*[context-tip]", function () {v…

清华 PowerPaint:多功能局部重绘模型

PowerPaint 是清华和上海人工智能实验室推出的一个开源高质量多功能的图像修补模型&#xff0c;同时支持插入物体、移除物体、图像扩展、形状可控的物体生成功能。 可以在 清华 PowerPaint&#xff1a;多功能局部重绘模型

【大语言模型系列之Transformer】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

关键词搜索商品API的工作原理是什么?

关键词搜索商品API的工作原理基于复杂的数据处理和检索机制&#xff0c;通过爬虫抓取、数据预处理、数据索引等流程。 在网上购物成为日常生活的一部分&#xff0c;关键词搜索商品API成为了电子商务平台不可或缺的功能。通过这种API&#xff0c;消费者可以轻松地通过输入关键字…

南京观海微电子----AC/DC、DC/DC转换器知识

什么是AC&#xff1f; Alternating Current&#xff08;交流&#xff09;的首字母缩写。 AC是大小和极性&#xff08;方向&#xff09;随时间呈周期性变化的电流。 电流极性在1秒内的变化次数被称为频率&#xff0c;以Hz为单位表示。 什么是DC? Direct Current&#xff08;直流…

微深节能 煤码头自动化翻堆及取料集控系统 格雷母线

微深节能格雷母线高精度位移测量系统是一种先进的工业自动化位置检测解决方案&#xff0c;它被广泛应用于煤码头自动化翻堆及取料集控系统中&#xff0c;以实现对斗轮堆取料机等大型机械设备的精准定位和自动化控制。 系统原理简述&#xff1a; 格雷母线系统的工作原理基于电磁…

通过一个单相逆变器仿真深度学习PR控制器

目录 前言 ​编辑 PR控制器的理论 PR控制器不同表达式及其建模 PR控制器连续积分组合及模型 PR控制器连续传递函数及模型 PR控制器离散积分及模型 PR控制器离散传递函数及模型 PR控制器差分方程及模型 系统仿真效果 总结 前言 在项目开发中常用PI控制器&#xff0c;这次在…

【CT】LeetCode手撕—148. 排序链表

目录 题目1- 思路2- 实现⭐148. 排序链表——题解思路 3- ACM 实现 题目 原题连接&#xff1a;148. 排序链表 1- 思路 排序链表&#xff0c;将每个元素看做一个单独的链表 ——> 归并排序 ——> 每次将单独的链表合并 2- 实现 ⭐148. 排序链表——题解思路 class Solu…

成人高考本科何时报名-深职训学校帮您规划学习之路

你有想过继续深造自己的学历吗&#xff1f;也许你已经工作多年&#xff0c;但总觉得学历是一块心病&#xff0c;想要通过成人高考本科来提升自己。不用着急&#xff0c;今天我们来聊一聊成人高考本科的报名时间&#xff0c;以及深职训学校如何帮助你顺利完成报名。 深圳成人高…