如何利用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日

相关文章

  • 新手入门常用代码集锦

    新手入门常用代码集锦 简介 对于前端新手来说,掌握常用的HTML、CSS和JavaScript代码是非常有必要的。本文从实战出发,收录了一些在实际开发中常用的代码,旨在帮助新手更快、更好地掌握前端开发技能。 HTML 常用标签 HTML中有一些标签是常用且必须掌握的,包括但不限于: <html>:定义文档的根元素 <head>:定义文…

    C 2023年5月23日
    00
  • C++语言实现hash表详解及实例代码

    C++语言实现hash表详解及实例代码攻略 什么是哈希表? 哈希表(Hash Table),也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做哈希表。 哈希表的实现 哈希表的实现通常涉及以下三个部分: 哈希函数(Has…

    C 2023年5月24日
    00
  • Android audio音频流数据异常问题解决分析

    Android audio音频流数据异常问题解决分析 背景 在 Android App 开发中,有时候会遇到音频流数据异常的问题,比如音频丢失、卡顿、噪声过大等,这些问题都会影响用户的使用体验。本文将从分析、解决两个方面,详细讲解如何解决 Android audio音频流数据异常问题,以提高用户的使用体验。 分析 检查音频流数据来源 首先要检查音频流数据的来…

    C 2023年5月22日
    00
  • C++中函数的用法小结

    C++中函数的用法小结 在C++中,函数是一个非常重要的元素,用于将代码分离和组合成逻辑单元。本文将对C++中函数的用法进行小结,以帮助初学者更好地理解和应用函数。 函数的定义 在C++中,函数的定义通常包括函数名、参数列表和函数体。可以用以下的方式声明一个函数: 返回类型 函数名(参数列表) { 函数体 } 其中,返回类型指定函数返回一个值的类型(如果函数…

    C 2023年5月24日
    00
  • Qt如何实现输入框@联系人的@检测的示例

    下面是Qt如何实现输入框@联系人的@检测的完整攻略: 准备工作 在开始示例前,需要先安装Qt的开发环境,并且熟悉Qt的基础知识(如信号槽、QLineEdit控件等)。如果你还不熟悉这些知识点,可以先学习Qt官方的文档或相关教程。 示例1:简单的@检测 首先,我们将创建一个简单的QLineEdit控件,用于演示@联系人的@检测功能。定义一个Qt信号量,用于回答…

    C 2023年5月23日
    00
  • C++三色球问题描述与算法分析

    下面是详细讲解C++三色球问题的完整攻略: 问题描述 假设有n个球,其中有红、黄、蓝三种颜色的球,每种颜色至少有一个球。将这n个球排成一列,并记下它们的颜色序列。请问,有多少种不同的颜色序列方式? 算法分析 可以使用递归算法来解决这个问题。 我们可以把球分为两个部分,第一个和剩下的n-1个。那么就可以先求出剩下的n-1个球的颜色排序,然后将第一个球插入到所有…

    C 2023年5月22日
    00
  • 关于C++11的统一初始化语法示例详解

    下面是关于”C++11的统一初始化语法示例详解”的攻略: 什么是C++11的统一初始化语法? C++11的统一初始化语法是一种新的初始化对象的语法,它可以用大括号“{}”来初始化各种类型的对象,包括基本类型、数组、结构体等。与传统的初始化语法相比,它更加方便、简洁,并且可以避免一些潜在的问题。 如何使用C++11的统一初始化语法? 使用C++11的统一初始化…

    C 2023年5月22日
    00
  • Django之提交表单与前后端交互的方法

    当我们在开发一个基于Django的Web应用时,提交表单和前后端交互是非常关键的环节,下面是提交表单与前后端交互的方法的完整攻略。 设置表单 创建一个表单类,该类必须继承自Django的forms.Form或modelforms.ModelForm,并声明表单所需要的字段。 示例代码: from django import forms class Conta…

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