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

C/C++调试工具GDB简单介绍

调试 (Debugging) 是软件开发过程中不可或缺的步骤之一,GDB(GNU Debugger)是C++开发中一个非常强大的调试工具。使用GDB可以帮助你找到并解决代码中的问题。下面是一些关于如何使用GDB进行调试的基础信息和常见命令。

1.安装GDB

在大多数Linux发行版上,GDB可以通过包管理器安装。例如:

sudo apt-get install gdb   # Debian/Ubuntu
sudo yum install gdb       # CentOS/RHEL
sudo pacman -S gdb         # Arch Linux

在MacOS上,你可以使用Homebrew来安装GDB:

brew install gdb

2.编译带调试信息的程序

为了让GDB能够识别你的代码,并提供源代码级别的调试功能,你需要在编译时添加 -g 选项。例如:

g++ -g -o my_program my_program.cpp

3.启动GDB

你可以通过以下命令启动GDB并加载你的程序:

gdb ./my_program

4.常用GDB命令

以下是一些基本的GDB命令,可以帮助你在调试过程中操作和检查程序。

  1. 启动和运行程序

    run [args]   # 启动程序并传递命令行参数
    
  2. 设置断点

    break main           # 在main函数处设置断点
    break filename:line  # 在特定文件的特定行设置断点
    break function_name  # 在特定函数入口设置断点
    
  3. 运行和控制程序执行

    run            # 运行程序,直到遇到断点
    continue       # 继续运行程序,直到遇到下一个断点
    next           # 执行下一行代码(不进入函数内部)
    step           # 执行下一行代码(进入函数内部)
    finish         # 运行到当前函数的末尾并返回调用者
    
  4. 检查变量和表达式

    print variable_name   # 打印变量的值
    print expression      # 计算并打印表达式的值
    info locals           # 显示当前范围内所有局部变量
    info args             # 显示当前函数所有参数
    
  5. 查看调用栈

    backtrace   # 显示当前调用栈
    frame       # 打印栈帧详细信息
    info frame  # 显示当前栈帧信息
    
  6. 其他实用命令

    list              # 显示源代码
    info breakpoints  # 显示所有断点信息
    delete [num]      # 删除一个或全部断点
    disassemble       # 显示当前代码的汇编指令
    

5.示例

以下是一个使用GDB调试简单C++程序的示例:

// example.cpp
#include <iostream>void foo(int a) {std::cout << "Value: " << a << std::endl;
}int main() {int x = 5;foo(x);return 0;
}

编译带有调试信息的程序:

g++ -g -o example example.cpp

启动GDB并设置断点:

gdb ./example
(gdb) break main          # 设置断点在main函数入口
(gdb) run                 # 运行程序
(gdb) next                # 执行到下一行代码
(gdb) print x             # 打印变量x的值
$1 = 5                    # 输出 x = 5
(gdb) continue            # 继续运行程序到下一个断点或结束
(gdb) quit                # 退出GDB

使用GDB可以大大提高你调试C++程序的效率,掌握这些基本命令可以帮助你更快地找到问题所在并修复你的代码。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 蓝桥杯真题——数星星
  • gitlab无法push(pre-receive hook declined)
  • vue3 响应式 API:readonly() 与 shallowReadonly()
  • MMdetection改进的目标检测算法
  • Mysql基础练习题 1407.排名靠前的旅行者(力扣)
  • ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解
  • C#编写上位机通过OPC DA读取西门子PLC数据
  • EmguCV学习笔记 C# 11.3 DNN其它
  • C++学习笔记(20)
  • Unity for Android使用蓝牙低功耗Bluetooth LE
  • linux 操作系统下crontab命令及使用案例介绍
  • mysql对于上期同期的时间的处理
  • 【QT】使用QOpenGLWidget后,窗口全屏之后右键菜单出不来的问题
  • 软件测试面试少走弯路
  • burp suite professional 产品介绍
  • [nginx文档翻译系列] 控制nginx
  • CSS 三角实现
  • Docker 笔记(2):Dockerfile
  • js
  • leetcode讲解--894. All Possible Full Binary Trees
  • Material Design
  • mysql常用命令汇总
  • oschina
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Spring声明式事务管理之一:五大属性分析
  • Vue2.0 实现互斥
  • 飞驰在Mesos的涡轮引擎上
  • 关于字符编码你应该知道的事情
  • 机器学习 vs. 深度学习
  • 盘点那些不知名却常用的 Git 操作
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • raise 与 raise ... from 的区别
  • ​力扣解法汇总946-验证栈序列
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (175)FPGA门控时钟技术
  • (pojstep1.3.1)1017(构造法模拟)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (vue)页面文件上传获取:action地址
  • (阿里云万网)-域名注册购买实名流程
  • (一)Dubbo快速入门、介绍、使用
  • (译) 函数式 JS #1:简介
  • .net core 连接数据库,通过数据库生成Modell
  • .NET gRPC 和RESTful简单对比
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .Net中的设计模式——Factory Method模式
  • /var/log/cvslog 太大
  • @Service注解让spring找到你的Service bean
  • @Transactional类内部访问失效原因详解
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [1]-基于图搜索的路径规划基础
  • [Android]常见的数据传递方式
  • [BZOJ 2142]礼物(扩展Lucas定理)