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

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)进行分析。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git上传文件

git init git add . git commit -m " " git remote add origin 仓库的地址 git push -u origin master 如果出现以下问题 可以用这一句强制上传 git push -f origin master

BME688 环境传感器

型号简介 BME688是博世&#xff08;bosch-sensortec&#xff09;的一款首款具有人工智能 (AI) 和集成高线性度和高精度压力、湿度和温度传感器的气体传感器。它采用坚固而紧凑的 3.0 x 3.0 x 0.9 mm 封装&#xff0c;专为移动和联网应用而开发&#xff0c;在这些应用中&#xf…

C++之boost智能指针

1、boost智能指针 资源获取即初始化&#xff1a;在构造函数中对资源进行初始化&#xff0c;在析构函数中释放。 智能指针的本质思想是&#xff1a;将堆对象的生存期&#xff0c;用栈对象来管理。这个栈对象就是智能指针。 当new 一个堆对象的时候&#xff0c;立刻用智能指针…

共享拼购:创新商业模式引领小用户基数下的销售奇迹“

在瞬息万变的商业蓝海中&#xff0c;一个新颖且深具潜力的策略正悄然改变着游戏规则&#xff0c;它巧妙地避开了传统路径的束缚&#xff0c;以微妙却深远的调整&#xff0c;开辟出了一条通往成功的独特航道。我的一位合作伙伴&#xff0c;正是这一策略的实践者&#xff0c;他在…

Blender渲染慢?那是你还不知道这5个技巧

Blender是一款功能强大且用途广泛的软件&#xff0c;可帮助 3D 艺术家和动画师创作出色的视觉内容。如果您使用过 Blender&#xff0c;您就会知道渲染可能非常耗时。渲染时间过长可能会令人烦恼并限制创造力。 在这篇文章中&#xff0c;我们将提供一些专家提示和想法以加快 Bl…

交换机需要多大 buffer

有点违背直觉&#xff0c;但是真事儿&#xff0c;交换机过境的流越多&#xff0c;所需 buffer 越小&#xff0c;这是为什么&#xff1f; 范氏(范雅各布森&#xff0c;van jacobson)管道的 aimd 流建议 buffer_size 为 bdp&#xff0c;这很容易理解&#xff0c;因为 aimd 流最小…

OpenCV库Windows端编译方法

编译前提 &#xff08;1&#xff09;下载好所需版本的OpenCV源码&#xff0c;点击进入下载地址&#xff0c;此处以OpenCV-2.4.13.6为例&#xff0c;下载页面截图如下图所示&#xff1a; 解压后如下图所示&#xff1a; &#xff08;2&#xff09;安装好CMake软件&#xff0c;点…

规则·理解·成长:与自闭症儿童共绘记忆蓝图

在星贝育园&#xff0c;作为专注于自闭症儿童康复的专业教育者&#xff0c;我们常常遇到家长的疑惑&#xff1a;“为什么我的孩子总是记不清楚规则&#xff1f;”这个问题触及了自闭症谱系障碍&#xff08;ASD&#xff09;儿童在理解与遵守规则方面面临的独特挑战。下面&#x…

软考中级系统集成项目管理工程师备考笔记

目录 一&#xff0c;通用内容 &#xff08;一&#xff09;信息与信息化 1.1&#xff0c;信息 信息基本概念 信息的传输模型 信息的质量属性 1.2&#xff0c;信息系统 信息系统的基本概念 信息系统定义 信息系统集成 1.3&#xff0c;信息化 信息化层次 信息化的核心…

【Redis】SpringBoot连接Redis

1. 创建项目并配置文件 勾选NoSQL中的 Spring Data Redis。当然,把 Web 中的 SpringWeb 也勾选一下.方便写接口进行后续测试。 在 application.yml 中配置 2. 不同数据类型使用Demo 在SpringBoot中&#xff0c;为我们提供了StringRedisTemplate类&#xff0c;供我们处理一些文…

MYSQL8.0环境部署

创建用户 groupadd mysql useradd -g mysql mysql 删除原来的包 # rpm -qa|grep mysql # rpm -qa|grep mari mariadb-libs-5.5.68-1.el7.x86_64 # rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 解压 cd /usr/local & mkdir mysql cd mysql # cp mysql-8…

tauri使用github action实现跨平台编译并解决编译错误,mac已损坏,无法打开,你应该将它移到废纸篓解决办法

正常编译为跨平台结果就像上面的&#xff0c;有mac/windows/linux的安装程序&#xff0c;直接下载就可以安装使用&#xff0c;我的这个livebox桌面端仓库地址&#xff1a;GitHub - Sjj1024/LiveBox: livebox&#xff0c;里面有编译文件可以参考。今天主要讲一下遇到的问题。 官…

视频文字提取在线怎么做?5个高效提取字幕的实用方法

无论是社交媒体上的短视频&#xff0c;还是在线教育的课程视频&#xff0c;字幕都成为了不可或缺的一部分。它们不仅帮助听力障碍人士更好地理解内容&#xff0c;还能让非母语观众更容易跟上节奏。 一提到字幕&#xff0c;我们可能会想到用它来做笔记&#xff0c;但要从视频中…

UVa1321/LA2925 Dice contest

UVa1321/LA2925 Dice contest 题目链接题意分析测试数据AC 代码 题目链接 本题是2003年icpc欧洲区域赛中欧赛区的D题 题意 骰子的六面展开图如下&#xff0c;现在把骰子的六个面赋予一套权重 w i ( 1 ≤ w i ≤ 50 , 1 ≤ i ≤ 6 ) w_i(1\le w_i \le 50,1\le i\le 6) wi​(1≤…

米国政府呼吁抛弃 C 和 C++

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 很多观点认为C 或 C永远不可被…

同步互斥与通信

目录 一、同步与互斥的概念 二、同步与互斥并不简单 三、各类方法的对比 一、同步与互斥的概念 一句话理解同步与互斥&#xff1a;我等你用完厕所&#xff0c;我再用厕所。 什么叫同步&#xff1f;就是&#xff1a;哎哎哎&#xff0c;我正在用厕所&#xff0c;你等会。 什…

nginx.conf配置参数解析

nginx配置文件解析 /usr/local/nginx/conf vim /etc/security/limits.conf #配置生效只能重新启动* soft nproc 65535 #能打开的进程最大数是软限制655335,65535是最大值 * hard nproc 65535 * soft nofile 65535 # 进程打开文件数的最大值65535 * hard nof…

最新美联储会议纪要:通胀降温,但不急于降息!

KlipC报道&#xff1a;当地时间周三&#xff0c;美联储公布了6月货币政策会议纪要。纪要显示&#xff0c;数据表明有通胀放缓的迹象&#xff0c;但如果降息需要更多的证据。此外&#xff0c;多位与会者表示&#xff0c;货币政策应随时准备应对意外的经济疲软。 会议纪要显示&a…

python-字典

为什么需要字典 字典的定义 字典数据的获取 字典的嵌套 嵌套字典的内容获取 字典的注意事项&#xff1a; 字典的常用操作 新增元素 更新元素 删除元素 清空字典 汇总 字典的特点

收银系统源码-收银台营销功能-定时折扣

1. 功能描述 定时折扣&#xff1a;在特定的时间段&#xff0c;将商品以打折的方式在收银台售卖&#xff0c;例如生鲜行业&#xff0c;由于生鲜是易耗品&#xff0c;很多门店晚上都会通过打折的方式进行促销&#xff1b; 2.适用场景 新门店开业、门店周年庆、节假日等特定时间…