【C++】GNU Debugger (GDB) 使用示例

文章目录

  • GDB 使用示例
    • GDB的常用命令
    • 示例

GDB 使用示例

GDB的常用命令

GDB(GNU Debugger)是一种Unix下的程序调试工具,用于调试C、C++等编程语言编写的程序。以下是一些GDB的常用命令:

启动和退出

  • runr:启动程序。
  • quitq:退出GDB。

查看源码和程序信息

  • listl:列出当前位置附近的源码。
  • info locals:显示当前栈帧的局部变量。
  • info args:显示当前函数的参数值。
  • info break:显示当前设置的断点信息。
  • info files:显示被调试的文件信息。
  • info functions:显示所有的函数名称。

设置断点

  • breakb:在指定位置设置断点。如 b main 在main函数处设置断点,b filename:linenum 在指定文件的指定行设置断点。
  • rbreak:在所有匹配正则表达式的函数上设置断点。
  • condition:为断点设置条件。

执行控制

  • continuec:继续执行程序,直到遇到下一个断点。
  • nextn:执行下一行代码,但不进入函数。
  • steps:进入函数。
  • finishfi:执行完当前函数,并返回到上一层函数。
  • untilu:执行程序直到退出当前循环。
  • jumpj:将程序计数器设置为指定地址,并继续执行。

查看和修改数据

  • printp:打印表达式的值。
  • set:修改变量的值。

日志和输出

  • set logging on/off:打开/关闭日志记录。
  • set logging file [filename]:设置日志文件的名称。

其他命令

  • start:从main函数开始执行,并停在main函数的第一条语句。
  • args:设置运行程序时传递给它的参数。
  • show args:显示传递给程序的参数。
  • kill:终止被调试的程序。

示例

创建项目目录和文件

首先,我们创建一个目录,并在其中创建必要的文件。

mkdir cmake_gdb_demo
cd cmake_gdb_demo
mkdir src
touch src/main.cpp
touch CMakeLists.txt

编写源代码

src/main.cpp中,编写一个简单的C++程序,该程序包含一个错误的函数。

// src/main.cpp
#include <iostream>

int add(int a, int b) {
    // 这里故意引入一个错误,将返回a而不是a+b
    return a;
}

int main() {
    int sum = add(2, 3);
    std::cout << "The sum is: " << sum << std::endl;
    return 0;
}

编写CMakeLists.txt

如果使用CMake编译你的C++项目,并希望包含调试信息以便使用GDB进行调试,你需要在CMakeLists.txt文件中指定构建类型为Debug。这通常通过设置CMAKE_BUILD_TYPE变量来完成。

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)

project(cmake_gdb_demo)
# 设置构建类型为Debug,这将包含调试信息  
set(CMAKE_BUILD_TYPE Debug)  

add_executable(cmake_gdb_demo src/main.cpp)

使用CMake构建项目

在项目的根目录下,创建一个构建目录并运行CMake。

mkdir build
cd build
cmake ..
make

使用GDB调试程序

现在,我们已经构建了程序,可以使用GDB进行调试。

gdb ./cmake_gdb_demo

在GDB中,按顺序执行以下命令:

  • break main: 在main函数处设置断点。
  • run: 运行程序,直到遇到断点。
  • list: 显示源代码的当前部分。
  • break add: 在add函数处设置断点。
  • continue: 继续执行程序,直到遇到下一个断点。
  • step: 进入add函数并执行下一条指令。
  • finish: 执行add函数的剩余部分并返回到调用者。
  • break 10: 在第10行设置断点。
  • continue: 继续执行程序,直到遇到下一个断点。
  • print sum: 打印sum变量的值(但此时它将是错误的,因为我们还没有修复add函数)。
  • quit: 退出GDB。
(gdb) break main
Breakpoint 1 at 0x921: file /home/CppProjects/cmake_gdb_demo/src/main.cpp, line 9.
(gdb) run
Starting program: /home/CppProjects/cmake_gdb_demo/build/cmake_gdb_demo 

Breakpoint 1, main () at /home/CppProjects/cmake_gdb_demo/src/main.cpp:9
9	    int sum = add(2, 3);
(gdb) list
4	    // 这里故意引入一个错误,将返回a而不是a+b
5	    return a;
6	}
7	
8	int main() {
9	    int sum = add(2, 3);
10	    std::cout << "The sum is: " << sum << std::endl;
11	    return 0;
12	}
(gdb) break add
Breakpoint 2 at 0x555555554914: file /home/CppProjects/cmake_gdb_demo/src/main.cpp, line 5.
(gdb) continue
Continuing.

Breakpoint 2, add (a=2, b=3) at /home/CppProjects/cmake_gdb_demo/src/main.cpp:5
5	    return a;
(gdb) step
6	}
(gdb) finish
Run till exit from #0  add (a=2, b=3) at /home/CppProjects/cmake_gdb_demo/src/main.cpp:6
0x0000555555554930 in main () at /home/CppProjects/cmake_gdb_demo/src/main.cpp:9
9	    int sum = add(2, 3);
Value returned is $1 = 2
(gdb) break 10
Breakpoint 3 at 0x555555554933: file /home/CppProjects/cmake_gdb_demo/src/main.cpp, line 10.
(gdb) continue
Continuing.

Breakpoint 3, main () at /home/CppProjects/cmake_gdb_demo/src/main.cpp:10
10	    std::cout << "The sum is: " << sum << std::endl;
(gdb) print sum
$2 = 2
(gdb) continue
Continuing.
The sum is: 2
[Inferior 1 (process 23968) exited normally]
(gdb) continue
The program is not being run.
(gdb)quit

后续可以在IDE或文本编辑器中修复add函数中的错误,然后重新构建并再次调试。

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

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

相关文章

Vue 3.3 编译宏 vue3.3新增了一些语法糖和宏,包括泛型组件、defineSlots、defineEmits、defineOptions

Vue 3.3新增了一些语法糖和宏&#xff0c;包括泛型组件、defineSlots、defineEmits、defineOptions defineProps 父组件传参 <template><Child name"my"></Child> </template> <script setup lang"ts"> import Child fro…

使用Docker安装Yapi接口管理工具

简介&#xff1a; YAPI 是由去哪儿网移动架构组开发的一款可视化接口管理工具。它具有可视化管理、高效易用、功能强大等特点。它提供了便捷的接口创建、发布和维护方式&#xff0c;开发人员可以通过简单的操作实现接口管理。 YAPI 还支持类似 postman 的接口调试&#xff0c;对…

06-数组

1. 为什么需要数组 一个养鸡场有6只鸡&#xff0c;它们的体重分别是3kg&#xff0c;4kg&#xff0c;1kg&#xff0c;2kg&#xff0c;6kg&#xff0c;3kg。 没有数组&#xff0c;就需要定义六个变量&#xff0c;一个变量代表一只鸡的体重。 使用数组&#xff0c;就可以定义一…

TypeScript学习日志-第二十三天(装饰器Decorator)

装饰器Decorator 一、类装饰器 ClassDecorator 其中返回的 target 是 Http 的构造函数&#xff0c;有了构造函数就不会去破坏其自身原有的结构&#xff0c;当我们 Http 里面有多个属性或者方法的&#xff0c;当是我们不想看或者改变它&#xff0c;这时候可以在构造函数中增加即…

【Mybatis操作数据库】入门(一)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MyBatis框架】 本专栏旨在分享MyBatis框架的学习笔记&#xff0c;如有错误定当洗耳恭听&#xff0c;欢迎大家在评论区交流讨论&#x1f…

59岁前TVB男拳王内地登台疑黑面 被批耍大牌

现年59岁的郭政鸿在2015年离巢TVB后转往内地发展&#xff0c;密密拍剧、登台及直播带货&#xff0c;短短几年就已经储够钱&#xff0c;斥资过千万买楼&#xff0c;成功上车做业主&#xff0c;可见收入丰厚。 早前郭政鸿现身顺德&#xff0c;在酒吧登台唱歌&#xff0c;有网民上…

《铁路出行更便捷:火车票预定审批系统的设计与应用》

在现代化的铁路交通管理中&#xff0c;火车票预定审批系统扮演着至关重要的角色。它不仅能够有效管理员工出差、培训等需要乘坐火车的行程&#xff0c;还能够提高审批效率&#xff0c;减少人力成本&#xff0c;确保出行安全。本文将探讨火车票预定审批系统的设计原则和应用场景…

计算机毕业设计Python+Spark知识图谱医生推荐系统 医生门诊预测系统 医生数据分析 医生可视化 医疗数据分析 医生爬虫 大数据毕业设计 机器学习

摘 要 随着我国社会经济发展水平的不断提高&#xff0c;人们的物质生活水平也有了很大的改善&#xff0c;越来越多的人不满足于当前的医疗服务质量&#xff0c;由于地域和空间的限制&#xff0c;医疗资源不平衡&#xff0c;无法实现全民共享。针对当今社会中存在的求医难的问题…

智能家居2 -- 实现网络控制模块

这一模块的思路和前面的语言控制模块很相似&#xff0c;差别只是调用TCP 去控制 废话少说&#xff0c;放码过来 增添/修改代码 socket_interface.c #include <pthread.h>#include "socket_interface.h" #include "control.h" #include "socke…

【教程】超简单!如何将“在VSCode中打开”添加到右键菜单中

按照以下步骤进行操作&#xff1a; 打开注册表编辑器&#xff1a; 按下 Win R 组合键打开运行对话框。输入 regedit 并按下 Enter 键打开注册表编辑器。 导航到适当的注册表项&#xff1a; 转到以下注册表项&#xff1a;HKEY_CLASSES_ROOT\Directory\Background\shell 创建…

26版SPSS操作教程(高级教程第十九章)

目录 前言 粉丝及官方意见说明 第十九章一些学习笔记 第十九章一些操作方法 树模型、随机森林与最近邻元素法 树模型 数据准备 具体操作 结果解释 对案例的进一步分析 结果解释 考虑应用模型时的成本与收益 保存新数据 在选项中看错误分类成本和利润 结果解释…

【管理篇】如何管理情绪?

目录标题 为什么要特别关注激动和愤怒两种情绪呢&#xff1f;管理自己的情绪大致的步骤三层脑结构爬行脑情绪脑视觉脑 大家说的情绪管理&#xff0c;基本上都是对于情绪激动、生气甚至是愤怒的管理&#xff1b;日常所说的情绪化&#xff0c;一般也是指某个人特别容易情绪激动&a…

Gitlab自动化测试的配置

1. 代码分支命名规范检测 Setting → Repository → Push rules → Branch name&#xff0c;添加分支命名规范对应的正则表达式。如&#xff1a; ^(Release|Tag|Develop|Feature)_._.|Main$ 表示分支名只能以以下关键字之一开头&#xff1a;Release、Tag、Develop和Feature。 …

基于模糊控制的AMT自动变速汽车换档智能控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于模糊控制的AMT自动变速汽车换档智能控制系统simulink建模与仿真。 2.系统仿真结果 输入的V&#xff0c;Ac&#xff0c;a 输出的档位&#xff1a; 3.核心程序与模型 版…

【BST】Behavior Sequence Transformer for E-commerceRecommendation in Alibaba

一、提出背景 传统的Embedding&MLP模型结构将原始特征嵌入到低维向量中&#xff0c;然后将其concat后输入MLP进行最终推荐。DIN提出使用注意力机制来捕获候选项与用户先前点击的项之间的相似性。 然而&#xff0c;大多数这些工作只是连接不同的特征&#xff0c;而没有捕获用…

通过 Java 操作 redis -- hash 哈希表基本命令

目录 使用命令 hset&#xff0c;hget 使用命令 hexists 使用命令 hdel 使用命令 hkeys&#xff0c;hvals 使用命令 hmget&#xff0c;hmset 关于 redis hash 哈希表类型的相关命令推荐看Redis - hash 哈希表 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务…

AVL Cruise与Simulink联合仿真(通过MATLAB DLL方式)

最近毕业设计需要用到AVL Cruise与Simulink进行联合仿真&#xff0c;分析汽车模型的经济性。下面介绍一下我所知的AVL Cruise与Simulink联合仿真的几种方式&#xff0c;它们各自的优缺点&#xff0c;以及DLL方式联合仿真的具体配置过程。我这里用的MATLAB软件版本是2021a&#…

运行Spring Boot项目失败?显示java: 无法访问org.springframework.boot.SpringApplication,让我来看看~

idea项目运行报错截图&#xff1a; &#xff08;1&#xff09;查看错误提示“类文件具有错误的版本 61.0, 应为 52.0”&#xff0c;61.0对应的是jdk17&#xff0c;52.0对应1.8。 通过这个网址可以查询版本&#xff1a; https://stackoverflow.com/questions/9170832/list-of-ja…

Linux文本三剑客

文章目录 一、文本搜索工具--grep1、简介2、工作原理3、语法格式4、选项介绍5、实例测试5.1、-i选项5.2、-v选项5.3、-n选项5.4、-c选项5.5、-o选项5.6、-B选项5.7、-A选项5.8、-C选项5.9、-w选项5.10、-E选项5.11、-e选项 二、流编辑器--sed1、简介2、工作原理3、语法格式4、选…

AI换脸原理(6)——人脸分割介绍

一、介绍 人脸分割是计算机视觉和图像处理领域的一项重要任务,它主要涉及到将图像中的人脸区域从背景或其他非人脸区域中分离出来。这一技术具有广泛的应用场景,如人脸识别、图像编辑、虚拟背景替换等。 在计算机视觉(CV)领域,经典的分割技术可以主要划分为三类:语义分…
最新文章