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

无法从命令行或调试器启动服务.必须首先_Emacs 调试秘籍之 GUD 调试器

673153393d37ec787ea81ce166c1f90a.png

本文简短地对 Emacs 的调试工具 GUD 的特性进行了探索。-- Vineeth Kartha(作者)

如果你是一个 C 或 C++ 开发者,你很可能已经使用过 GDB(GNU 调试器),毫无疑问,它是现今最强大、最无可匹敌的调试器之一。它唯一的缺点就是它基于命令行,虽然仍能提供许多强大的功能,但有时也会具有一些局限性。这也就是为什么聪明的人们开始追求整合了编辑器和调试器的 图形化( GUI ) 集成开发环境(Integrated Development Environment)。仍有些开发者坚信使用鼠标会降低工作效率,在 GUI 上用鼠标点~点~点~是来自恶魔的诱惑。

因为 Emacs 是现今最酷的文本编辑器之一,我将为你展示如何在不碰鼠标且不离开 Emacs 的情况下,实现写代码、编译代码、调试代码的过程。

GUD(LCTT 译注:全称 大统一调试器(Grand Unified Debugger),鉴于其缩写形式更为人熟知,以下全文将使用缩写替代此全称)是 Emacs 下的一个 模式(mode),用于在 Emacs 中运行 GDB。它向 GDB 提供了 Emacs 的所有特性,使用户无需离开编辑器就可以对代码进行调试。

使用 GUD 的前期准备

如果你正在使用一个 Linux 机器,很可能你已经安装了 GDB 和 gcc,接下来就是要确保已经安装了 Emacs。以下的内容我将假设读者熟悉 GDB 并且至少用它做过基本的调试。如果你未曾接触过 GDB,你可以做个快速入门,这些资料在网上随处可得。

对于那些 Emacs 新手,我将向你介绍一些基本术语。纵览整篇文章,你将看到诸如 C-c M-x 等快捷键。此处 C 代表 Ctrl 键,M 代表 Alt 键。C-c 代表 Ctrl 键和 c 键被同时按下。如果你看到 C-c c,它代表同时按下 Ctrl 键和 c 键,释放后紧接着按下 c 键。在 Emacs 中,编辑文本的主要区域被称为 主缓冲区(main buffer),而在 Emacs 窗口下方用于输入命令的区域被称为 迷你缓冲区(mini buffer)。

启动 Emacs,并按下 C-x C-f 来创建一个新文件。Emacs 将提示你输入一个文件名,此处让我们将文件命名为 buggyFactorial.cpp。一旦文件打开,输入如下代码:

#include#include int factorial(int num) {  int product = 1;  while(num--) {    product *= num;  }  return product;}int main() {  int result = factorial(5);  assert(result == 120);}

使用 C-x C-s 快捷键保存文件。文件保存完毕,是时候进行编译了。按下 M-x,在弹出的 提示符(prompt)后输入 compile 并点击回车。然后在提示符后,将内容替换为 g++ -g buggyFactorial.cpp 并再次点击回车。

406a1bc4280f0142c31b5732c5f9d45d.png

图 1: Emacs 迷你缓冲区中编译命令

这将在 Emacs 中开启另一个缓冲区,显示编译的状态。如果你的代码输入没有错误,你将预期得到如图 2 所示的缓冲区。

b687c4601288c2b925eae980d0ed23a6.png

图 2: 编译状态

要想隐藏编译缓冲区,首先确保你的光标在编译缓冲区中(你可以不使用鼠标,而是通过 C-x o 快捷键将光标从一个缓冲区移动到另一个),然后按下 C-x 0。下一步就是运行代码,并观察是否运行良好。按下 M-! 快捷键并在迷你缓冲区的提示符后面输入 ./a.out。

c6b15b53f2317b5ec4cb593093b1cc70.png

图 3: 代码在迷你缓冲区中的输出

你可以看到迷你缓冲区中显示断言失败。很明显代码中有错误,因为 5 的阶乘是 120。那么让我们现在开始调试吧。

使用 GUD 调式代码

现在,我们的代码已经编译完成,是时候看看到底哪里出错了。按下 M-x 快捷键并在提示符后输入 gdb。在接下来的提示符后,输入 gdb -i=mi a.out。如果一切顺利,GDB 会在 Emacs 缓冲区中启动,你会看到如图 4 所示的窗口。

480b58cb27e9e84ccf3392bda8c57779.png

图 4: Emacs 中的 GDB 缓冲区

在 gdb 提示符后,输入 break main 来设置断点,并输入 r 来运行程序。程序会开始运行并停在 main() 函数处。

一旦 GDB 到达了 main 处设置的断点,就会弹出一个新的缓冲区显示你正在调试的代码。注意左侧的红点,正是你设置断点的位置,同时会有一个小的标志提示你当前代码运行到了哪一行。当前,该标志就在断点处(如图 5)。

9de4a87ad264f87aeda73d3ff59ca457.png

图 5: GDB 与代码显示在两个分离的窗口

为了调试 factorial 函数,我们需要单步运行。想要达到此目的,你可以在 GBD 提示符使用 GDB 命令 step,或者使用 Emacs 快捷键 C-c C-s。还有其它一些快捷键,但我更喜欢 GDB 命令。因此我将在本文的后续部分使用它们。

单步运行时让我们注意一下局部变量中的阶乘值。参考图 6 来设置在 Emacs 帧中显示局部变量值。

20cd3d86133dd011cc48f1423270d44e.png

图 6: 在 Emacs 中使用独立帧显示局部变量

在 GDB 提示符中进行单步运行并观察局部变量值的变化。在循环的第一次迭代中,我们发现了一个问题。此处乘法的结果应该是 5 而不是 4。

本文到这里也差不多结束了,读者可以自行探索发现 GUD 模式这片新大陆。GDB 中的所有命令都可以在 GUD 模式中运行。我将此代码的修复留给读者作为一个练习。看看你在调试的过程中,可以做哪一些定制化,来使你的工作流更加简单和高效。


相关文章:

  • googlenet网络结构_图像处理必读论文之五GoogLeNet-3
  • 编写tcp服务器发送hex格式_恶意程序编写之免杀基础
  • webgis从基础到开发实践_WebGIS开发进阶练手题(二)
  • idea 启动vue 一会自己停了_这 几个 IDEA,调试的骚操作,用了都说爽!
  • java 桌面应用程序_针对初学Java的小伙伴,入门时应该了解的Java基础知识
  • python面向对象思路_Python基础之面向对象的软件开发思路
  • python主要应用于云计算的哪些方面_python在云计算的应用领域
  • python小程序_如何使用 Python 开发微信小程序
  • 华为平板wps语音朗读_年轻人智慧生活:荣耀笔记本、平板V6,智慧屏X1等多款新品再升级...
  • python复制文件夹所有文件到另外目录_如何使用Python将文件的整个目录复制到现有目录中?...
  • python输入多个数字 找出只出现一个的数字_【算法14】找出数组中两个只出现一次的数字...
  • python随机抽人小程序_python抽人程序初试
  • lodop打印不显示页码_教你9招,一次性解决Excel表格打印问题!
  • 原型和原型链的理解_理解Javascript的原型和原型链
  • 一个事务中 可以查询自己未提交的数据吗_来谈谈MySQL事务及事务引发的问题
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Android 控件背景颜色处理
  • axios 和 cookie 的那些事
  • CentOS6 编译安装 redis-3.2.3
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • magento2项目上线注意事项
  • Mysql5.6主从复制
  • PHP 的 SAPI 是个什么东西
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • React-生命周期杂记
  • ubuntu 下nginx安装 并支持https协议
  • vue.js框架原理浅析
  • windows下mongoDB的环境配置
  • 初识MongoDB分片
  • 电商搜索引擎的架构设计和性能优化
  • 将 Measurements 和 Units 应用到物理学
  • 警报:线上事故之CountDownLatch的威力
  • 那些被忽略的 JavaScript 数组方法细节
  • 线上 python http server profile 实践
  • 优秀架构师必须掌握的架构思维
  • HanLP分词命名实体提取详解
  • ​渐进式Web应用PWA的未来
  • #162 (Div. 2)
  • #define
  • #define,static,const,三种常量的区别
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (windows2012共享文件夹和防火墙设置
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (超详细)语音信号处理之特征提取
  • (第61天)多租户架构(CDB/PDB)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (五)关系数据库标准语言SQL
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • 、写入Shellcode到注册表上线
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .dwp和.webpart的区别
  • .net Application的目录
  • .NET Standard 支持的 .NET Framework 和 .NET Core