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

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

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

相关文章

vue3.0(十六)axios详解以及完整封装方法

文章目录 axios简介1. promise2. axios特性3. 安装4. 请求方法5. 请求方法别名6. 浏览器支持情况7. 并发请求 Axios的config的配置信息1.浏览器控制台相关的请求信息&#xff1a;2.配置方法3.默认配置4.配置的优先级5.axios请求响应结果 Axios的拦截器1.请求拦截2.响应拦截3.移…

回流焊常见缺陷

不润湿(Nonwetting)/润湿不良(Poor Wetting) 通常润湿不良是指焊点焊锡合金没有很好的铺展开来,从而无法得到良好的焊点并直接影响到焊点的可靠性。 产生原因: 1. 焊盘或引脚表面的镀层被氧化,氧化层的存在阻挡了焊锡与镀层之间的接触; 2. 镀层厚度不够或是加工不良,很…

常见测试测量接口的比较:PXI、PXIe、PCI、VXI、GPIB、USB

详细比较了六种常见的测试测量接口&#xff1a;PXI、PXIe、PCI、VXI、GPIB、USB。每种接口都有其独特的特点和应用场景。通过比较它们的性能、带宽、模块化程度和应用领域&#xff0c;帮助工程师选择最适合其测试需求的接口类型。 1. PXI&#xff08;PCI eXtensions for Instru…

uboot 编译时传递参数实现条件编译

KCFLAGS make ARCHarm KCFLAGS-DENV_DEBUG CROSS_COMPILEaarch64-linux-gnu-env/sf.c env_sf_save 加入调试信息 # saveenv Saving Environment to SPI Flash... env_sf_save (1) spi_flash_erase (2) spi_flash_write is40000 Erasing SPI flash...Writing to SPI flash.…

试用笔记之-Delphi xe 微信/支付宝支付源代码

首先delphi xe 微信/支付宝支付源代码下载&#xff1a; http://www.htsoft.com.cn/download/DelphiXEWeiXin_ZhiFuBao_ZhiFu.rar 解压后可以看到源代码 直接执行可执行文件&#xff1a;

大模型技术在辅助学习中的应用

大模型技术在辅助学习中的应用场景非常广泛&#xff0c;以下是一些典型示例。大模型技术在辅助学习中具有广阔的应用前景&#xff0c;可以为学生提供更加个性化、智能化和高效的学习体验。随着大模型技术的不断发展&#xff0c;我们可以期待在未来看到更多创新应用。北京木奇移…

【Python】已解决:ERROR: No matching distribution found for JPype1

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ERROR: No matching distribution found for JPype1 一、分析问题背景 在安装Python的第三方库时&#xff0c;有时会遇到“ERROR: No matching distribution fo…

前端技术(说明篇)

Introduction ##编写内容&#xff1a;1.前端概念梳理 2.前端技术种类 3.前端学习方式 ##编写人&#xff1a;贾雯爽 ##最后更新时间&#xff1a;2024/07/01 Overview 最近在广州粤嵌进行实习&#xff0c;项目名称是”基于Node实现多人聊天室“&#xff0c;主要内容是对前端界…

springboot图书馆座位预约系统-计算机毕业设计源码85670

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2开发现状 1.3论文结构与章节安排 2 开发环境及相关技术介绍 2.1 MySQL数据库 2.2 Tomcat服务器 2.3 Java语言 2.4 SpringBoot框架介绍 3 图书馆座位预约系统系统分析 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 经济可…

【Qt】初识QtQt Creator

一.简述Qt 1.什么是Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式&#xff0c;开发者可以通过简单的拖拽和组合来实现…

基于ESP32 IDF的WebServer实现以及OTA固件升级实现记录(三)

经过前面两篇的前序铺垫&#xff0c;对webserver以及restful api架构有了大体了解后本篇描述下最终的ota实现的代码以及调试中遇到的诡异bug。 eps32的实际ota实现过程其实esp32官方都已经基本实现好了&#xff0c;我们要做到无非就是把要升级的固件搬运到对应ota flash分区里面…

2.3 主程序和外部IO交互 (文件映射方式)----IO Server实现

2.3 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----IO Server C实现 效果显示 1 内存共享概念 基本原理&#xff1a;以页面为单位&#xff0c;将一个普通文件映射到内存中&#xff0c;达到共享内存和节约内存的目的&#xff0c;通常在需要对文件进行频繁读写时…

手写一个类似@RequestParam的注解(用来接收请求体的参数)

一、本文解决的痛点 按照大众认为的开发规范&#xff0c;一般post类型的请求参数应该传在请求body里面。但是我们有些post接口只需要传入一个字段&#xff0c;我们接受这种参数就得像下面这样单独创建一个类&#xff0c;类中再添加要传入的基本类型字段&#xff0c;配合Reques…

LLM指令微调Prompt的最佳实践(二):Prompt迭代优化

文章目录 1. 前言2. Prompt定义3. 迭代优化——以产品说明书举例3.1 产品说明书3.2 初始Prompt3.3 优化1: 添加长度限制3.4 优化2: 细节纠错3.5 优化3: 添加表格 4. 总结5. 参考 1. 前言 前情提要&#xff1a; 《LLM指令微调Prompt的最佳实践&#xff08;一&#xff09;&#…

nexus未开启匿名访问Anonymous Access,访问maven元数据maven-metadata,报401未授权Unauthorized错误

一、背景 下午在调试nexus的时候&#xff0c;其他同事不小心把匿名访问停用了&#xff0c;导致客户端android打包的时候&#xff0c;报错&#xff1a; Received status code 401 from server: Unauthorized。 访问http://192.168.xx.xx:8081/repository/public/com/xxx/xxxcor…

【软件测试】单元测试、系统测试、集成测试详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、单元测试的概念 单元测试是对软件基本组成单元进行的测试&#xff0c;如函数或一个类的方法…

PCL 点云最小图割(前景、背景点云提取)

点云最小图割 一、概述1.1 概念1.2 算法原理二、代码示例三、运行结果🙋 结果预览 一、概述 1.1 概念 最小图割算法(pcl::MinCutSegmentation):是一种基于图论的对象分割方法,主要用于点云数据的处理和分析。该算法将点云数据表示为一个图结构,其中点云中的点作为图的节…

【Java】微博系统设计:怎么应对热点事件的突发访问压力?

一、问题解析 微博&#xff08;microblog&#xff09;是一种允许用户即时更新简短文本&#xff08;比如140个字符&#xff09;&#xff0c;并可以公开发布的微型博客形式。今天我们就来开发一个面向全球用户、可以支持10亿级用户体量的微博系统&#xff0c;系统名称为“Weitte…