如何利用Emacs来调试C++程序

如何利用 Emacs 来调试 C++ 程序


第一步:在 C++ 文件中设置断点

在你的 C++ 程序中设置断点,使程序在运行到此处时暂停。你可以在需要设置断点的行前加入以下代码:

int main() {
    int a = 1;
    int b = 2;
    int c = a + b; // 在此处设置断点
    return c;
}

第二步:在 Emacs 中开始调试

  1. 打开 Emacs,打开你的 C++ 文件。
  2. 按下快捷键 Alt + x,在最下方的 Emacs 命令行中输入 gdb,然后按下回车键。
  3. 命令行提示符会变成 (gdb)。输入 run 命令,按下回车键开始运行程序。
  4. 当程序运行到你之前设置的断点处时会停下来等待调试命令。

第三步:在 Emacs 中使用调试命令

在程序暂停时,你可以使用以下调试命令:

  • list - 显示当前停止的地方附近的代码行。
  • break - 设置一个新的断点(在代码行前)或用未加载模块中的地址设置一个新断点。
  • delete - 删除一个或多个已经设置的断点。
  • next - 执行下一条代码行。如果这一行是函数调用,则跳过整个函数并暂停在函数返回之后的下一行。
  • step - 进入下一个步骤。如果当前行是尚未调用的函数,则进入该函数。
  • continue - 继续执行程序到下一个断点或程序终止。
  • print - 显示变量的值。

我们来看一个示例。假设我们要查看 ab 的值。我们可以在程序暂停时,输入以下命令:

print a
print b

这将显示 ab 的当前值。

示例一:调试数组

让我们通过使用断点和打印命令来调试 C++ 中的数组。

#include <iostream>

using namespace std;

int main() {
    int arr[5] = { 1, 2, 3, 4, 5 };

    for (int i = 0; i < 5; i++) {
        cout << "arr[" << i << "] = " << arr[i] << endl;
    }

    return 0;
}

我们想要查看数组的值及其索引。我们可以在循环中的第一行前添加以下代码:

for (int i = 0; i < 5; i++) {
    int temp = 0; // 在此处设置断点
    cout << "arr[" << i << "] = " << arr[i] << endl;
}

然后我们从命令行调用 GDB:

$ gdb test

在 GDB 中启动程序并等待程序停止:

(gdb) run

程序运行到断点处时暂停。我们可以打印 arr 数组的值:

(gdb) print arr[0]
$1 = 1
(gdb) print arr[3]
$2 = 4

我们还可以查看 i 的值:

(gdb) print i
$3 = 0

现在我们可以继续执行程序:

(gdb) continue

在循环的下一次迭代中,GDB 又会停下来,我们可以继续查看数组及其索引的值。

示例二:调试函数

让我们通过调试函数来进一步了解 GDB。

#include <iostream>

int sum(int a, int b) {
    return a + b;
}

int main() {
    int x = 10;
    int y = 20;
    int z = sum(x, y);

    std::cout << "The sum of " << x << " and " << y << " is " << z << std::endl;

    return 0;
}

我们希望调试 sum 函数。在其定义之前的行上设置一个断点并启动 GDB。

int sum(int a, int b) {
    int temp = 0; // 在此处设置断点
    return a + b;
}

然后从命令行启动 GDB 并运行程序:

$ gdb test
(gdb) run

当程序运行到断点处时,我们可以在函中输入以下命令:

(gdb) print a
$1 = 10
(gdb) print b
$2 = 20

我们可以使用 nextstep 命令继续执行函数,直到它返回到主函数中。然后我们就可以退出 GDB 了。

(gdb) continue
(gdb) quit

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何利用Emacs来调试C++程序 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • C/C++百行代码实现热门游戏消消乐功能的示例代码

    C/C++百行代码实现热门游戏消消乐功能的示例代码攻略 简介 消消乐是一款非常流行的益智游戏,其核心游戏玩法是三消规则,在有限的步数内将相同颜色(或形状)的方块消除。本文将通过C/C++语言编写少于100行代码来实现消消乐游戏功能。 实现步骤 第一步:定义方块 我们需要定义游戏中的方块,方块应该包含颜色、形状以及消除状态等属性。具体实现如下: struct …

    C 2023年5月24日
    00
  • Java多线程中wait、notify、notifyAll使用详解

    Java多线程中wait、notify、notifyAll使用详解 简介 Java多线程提供了三个关键字:wait, notify和notifyAll,这三个关键字主要用于线程间的协调与通信,可有效避免线程之间产生相互干扰和互斥的问题。本章节主要对这三个关键字的使用进行详细讲解。 wait方法 语法格式 下面是wait方法的语法格式: public fina…

    C 2023年5月22日
    00
  • 非常好的12道shell命令经典面试问题

    整个攻略分为以下几个部分: 介绍12个经典的面试问题 每个问题的解答及解析 给出示例说明 1. 介绍12个经典的面试问题 以下是12个经典的面试问题: 如何显示当前的工作目录? 如何检查一个命令是否在系统中存在? 如何列出目录中所有文件的名称? 如何列出一个文件的前10行? 如何查找文件中的特定文本? 如何在Linux上安装软件包? 如何查看一个文件的大小?…

    C 2023年5月22日
    00
  • C++实现Dijkstra(迪杰斯特拉)算法

    下面我将为你讲解如何使用C++实现Dijkstra(迪杰斯特拉)算法。 Dijkstra算法简介 Dijkstra算法是解决单源最短路径问题的一种贪心算法。Dijkstra算法最初是由荷兰的计算机科学家Edsger W. Dijkstra于1956年提出的。该算法的思路是从起点开始,依次访问每个相邻节点,确定从起点到该节点的最短路径,并将该节点标记为已访问。…

    C 2023年5月22日
    00
  • set_new_handler(0)有什么用

    set_new_handler是C++语言提供的一个函数,用于设置一个新的内存分配失败处理程序。当内存分配操作失败时,该处理程序将被调用。当我们在C++程序中使用new操作符申请内存时,如果系统找不到合适的内存块,就会触发内存分配失败,进而导致程序抛出std::bad_alloc异常。 set_new_handler(0)的作用是设置一个新的内存分配失败处理…

    C 2023年5月23日
    00
  • win10下定时运行与开机自启动jar包的方法记录

    我来给你详细讲解win10下定时运行与开机自启动jar包的方法。我们可以分为两个部分来讲解,下面将分别进行详细介绍。 一、定时运行jar包的方法记录 1.安装JRE环境 在运行Java程序之前,需要安装Java Runtime Environment(JRE)环境。可以在官网下载安装。 2.运行jar包 运行jar包有多种方法,我们这里介绍一种简单的方法:使…

    C 2023年5月22日
    00
  • C#使用Clipboard类实现剪贴板功能

    C#使用Clipboard类实现剪贴板功能 导读 剪贴板是电脑生产过程中至关重要的一部分,通过使用剪贴板,我们可以在不同的应用程序和文本之间快速、方便地复制和粘贴数据。在C#中,我们可以使用Clipboard类来实现剪贴板的功能,本文将详细讲解如何在C#应用程序中使用Clipboard类来实现剪贴板功能。 使用Clipboard类 在C#中,Clipboar…

    C 2023年5月23日
    00
  • 联发科Helio G70/G70T处理器怎么样 联发科Helio G70/G70T处理器介绍

    联发科Helio G70/G70T处理器介绍 联发科Helio G70/G70T处理器是联发科(MediaTek)公司推出的一款面向入门级别手机的处理器芯片,该处理器采用12nm工艺制程,搭配Mali-G52 MC2 GPU,具备优异的性价比表现。本文将详细介绍该处理器的性能和特点。 性能表现 联发科Helio G70/G70T处理器采用2颗Cortex-A…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部