【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+breturn 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.mzph.cn/bicheng/9020.shtml

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

相关文章

【ArcGIS 脚本工具】格式化简单渲染图层或图层组

CAD加GIS是规划人的黄金搭档&#xff0c;不可偏废。 小编通常直接在ArcPro中加载CAD查看&#xff0c;这样可以保证CAD修改之后GIS能同步更新显示。 但是CAD在ArcPro中的显示多少有点水土不服。 比如湘源地块在ArcPro3.0中显示时会自动加上透明度&#xff0c;虽然这样可以看到…

汇集全球顶级AI的自助平台

1、介绍:此平台以其开放和便捷的特性,为用户提供了一个无需月费的 AI 服务入口。咱可以根据自己的需求,灵活选择和付费使用平台上的 AI 技术。 该平台强调的核心优势在于 “零门槛” 和 “按需付费”,意味着用户不需要进行大额预付或者承担长期的固定费用,而是可以根据实际…

利用爬虫解决数据采集难题

文章目录 安装为什么选择 BeautifulSoup 和 requests&#xff1f;安装 BeautifulSoup 和 requests解决安装问题 示例总结 在现代信息时代&#xff0c;数据是企业决策和发展的关键。然而&#xff0c;许多有用的数据分散在网络上&#xff0c;且以各种格式和结构存在&#xff0c;因…

设计模式学习(八)——《大话设计模式》

设计模式学习&#xff08;八&#xff09;——《大话设计模式》 单一职责原则 单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;是软件开发中 SOLID 原则之一&#xff0c;由罗伯特C马丁&#xff08;Robert C. Martin&#xff09;提出。它指的是一个类…

Could not find the Qt platform plugin “dxcb“ in ““、 重点:是dxcb

这个重点就在于是dxcb不是xcb&#xff0c;让我一顿好找。 https://bugs.launchpad.net/ubuntu/source/deepin-qt5dxcb-plugin/bug/1826629 这篇文章描述了应该是deepin系统的一个问题&#xff0c;应该已经修复了不知道为什么我还会遇到。 不过知道是dxcb后直接去qtcreater里的系…

ROS 2边学边练(45)-- 构建一个能动的机器人模型

前言 在上篇中我们搭建了一个机器人模型(其由各个关节&#xff08;joint&#xff09;和连杆&#xff08;link&#xff09;组成)&#xff0c;此篇我们会通过设置关节类型来实现机器人的活动。 在ROS中&#xff0c;关节一般有无限旋转&#xff08;continuous&#xff09;,有限旋转…

Android 注解

自定义注解 注解原理 注解本质是一个接口&#xff0c;Java中所有注解都是继承了Annotation接口的 注解(…)&#xff1a;其实就是一个实现类对象&#xff0c;实现了该注解以及Annotation接口。

TB交易开拓者旗舰版自动交易的设置

本文针对TB交易开拓者旗舰版V6.0.7.0(期货程序化交易软件下载 - 交易开拓者),目前网上没有自动交易设置的完整教程&#xff0c;特写此篇。 1. 设置期货账户的自动登录和登出。点击菜单“文件/系统设置”&#xff0c;然后在“安全”tab做如下设置&#xff1a; 2 设置你的期货账…

C++向函数传递对象

C语言中&#xff0c;对象作为函数的参数和返回值的传递方式有 3 种&#xff1a;值传递、指针传递和引用传递。 1. 对象作为函数参数 把实参对象的值复制给形参对象&#xff0c;这种传递是单向的&#xff0c;只从实参到形参。因此&#xff0c;函数对形参值做的改变不会影响到实…

Sybase数据库分页查询(指定起始位置)

针对单表数据量过大的场景&#xff0c;分页查询必不可少。针对sybase数据库分页查询的案例全网稀少&#xff0c;特别是指定起始页的分页查询实现。 本文依靠实际开发场景&#xff0c;特此总结Sybase数据库分页查询&#xff08;指定起始位置&#xff09;。 目录 一、 SQL实现分…

视频号小店不直播怎么出单?这里面的秘密,一篇文章全曝光!

大家好&#xff0c;我是电商糖果 这两年关于视频号搞电商的话题度非常高&#xff0c;也吸引了很多商家入驻。 视频号因为背后巨大的私域流量池扶持&#xff0c;所以它的转化率非常高。 根据官方发出来的战报&#xff0c;我们也可以看出它的数据是翻倍增长。 在2024微信公开…

git对远程和本地分支进行重命名

要同时对Git的远程和本地分支进行重命名&#xff0c;你需要分几个步骤操作&#xff1a; 重命名本地分支 切换到其他分支&#xff1a;在重命名当前分支之前&#xff0c;确保你不在你想要重命名的那个分支上。你可以通过以下命令切换到另一个分支&#xff08;比如切换到master分…

5.06号模拟前端面试8问

5.06号模拟前端面试8问 1.promise如何实现then处理 在JavaScript中&#xff0c;Promise 是一个代表异步操作最终完成或失败的对象。它有三种状态&#xff1a;pending&#xff08;等待&#xff09;&#xff0c;fulfilled&#xff08;完成&#xff09;&#xff0c;rejected&…

红日靶场ATTCK攻击合集

工作繁忙&#xff0c;笔记更新的有比较慢&#xff0c;转到CSDN同步更新很麻烦&#xff0c;直接看原始的笔记吧。不足之处欢迎多多指点。 已经打完的靶场如下&#xff1a; 红日靶场ATT&CK1&#xff1a;https://blog.csdn.net/weixin_44288604/article/details/108172737红…

Java面试题:描述Exchanger类的用途以及如何用它来交换数据

在编程中&#xff0c;Exchanger 类通常是Java并发编程中用于线程间数据交换的一个类。它属于java.util.concurrent包&#xff0c;提供了一种在两个线程之间进行数据交换的机制。使用Exchanger&#xff0c;两个线程可以交换数据&#xff0c;每个线程都可以提供数据并接收对方的数…

【漏洞复现】GB28181摄像头管理平台api接口处存在未授权漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

faad2交叉编译——aac解码为pcm,解决faad单通道转双通道问题

FAAD是比较成熟高效的开源AAC解码库&#xff0c;这里用于解码AAC生成PCM数据&#xff0c;用于音频播放。这里因为faad库&#xff0c;会将单通道转化为双通道踩了些坑&#xff0c;所以记录一下。 我使用的是2.11.0版本&#xff0c;貌似往前的版本没有使用CMake&#xff0c;需要c…

C++中如何自己封装一个Callable

需求背景 有时候静态编译太不灵活&#xff0c;我们需要更灵活的运行时操作。 又或真假设你在开发一个脚本&#xff0c;想注册本地的C函数到脚本语言的标准库中。例如gdscript的Callable。 下面是一个我的一个简单的实现。我们假设脚本语言中的变量类型是std::any。根据情况不…

《Fundamentals of Power Electronics》——一些常用变换器的正则电路参数值

对于理想的CCM PWM dc-dc转换器&#xff0c;其包含一个电感和电容&#xff0c;正则模型有效的低通滤波器需要包含一个电感和一个电容。正则模型简化为如下图所示。 假设电容与负载直接相连。基础的buck、boost和buck-boost转换器的参数值如下表所示。 该模型可以用传统的线性电…

使用网站内容进行多渠道品牌营销的主要优势

在选择服务提供商时&#xff0c;人们使用不同的方式来查找信息并与他们联系。有些人更喜欢网站&#xff0c;有些人则使用社交媒体或电子邮件。网站对于数字存在仍然至关重要&#xff0c;但跨多个渠道管理内容现在至关重要。多渠道营销以客户喜欢的方式与客户建立联系&#xff0…