本文简单探讨一下Emacs的调试工具GUD的特点。如果您是C或C++开发人员,您很可能使用过GDB(GNU调试器),毫无疑问,它是当今最强大和无与伦比的调试器之一。它唯一的缺点是它是基于命令行的,虽然它仍然提供很多很棒的功能,但有时会有一些限制。这就是为什么聪明人开始追求集成开发环境,一种集编辑器和调试器为一体的图形化GUI集成开发环境。还有一些开发者坚信使用鼠标会降低工作效率,在GUI上用鼠标点~点~点~是魔鬼的诱惑。因为Emacs是目前最酷的文本编辑器之一,所以我将向您展示如何在不接触鼠标或离开Emacs的情况下编写代码、编译代码和调试代码。GUD(LCTT译注:GrandUnifiedDebugger,GrandUnifiedDebugger的全称,由于缩写比较熟悉,以下全文将用缩写代替全名)是Emacs下的一种mode模式,用于运行GDB在Emacs中。它为GDB提供了Emacs的所有功能,允许用户在不离开编辑器的情况下调试代码。使用GUD的先决条件如果您使用的是Linux机器,很可能您已经安装了GDB和gcc,下一步是确保您安装了Emacs。在接下来的内容中,我将假设读者熟悉GDB并且至少已经用它进行了基本调试。如果您是GDB的新手,您可以快速入门,这在Web上很容易获得。对于Emacs的新手,我将向您介绍一些基本术语。在整篇文章中,您将看到诸如C-cM-x之类的快捷键。这里C代表Ctrl键,M代表Alt键。C-c表示同时按下Ctrl键和c键。如果您看到C-cc,则表示同时按下Ctrl键和c键,松开键后松开c键。在Emacs中,主要用于编辑文本的区域称为主缓冲区,而Emacs窗口下方用于输入命令的区域称为迷你缓冲区。启动Emacs,然后按C-xC-f创建一个新文件。Emacs将提示您输入文件名,我们在这里将文件命名为buggyFactorial.cpp。打开文件后,输入以下代码:#include#includeintfactorial(intnum){intproduct=1;while(num--){产品*=num;}returnproduct;}intmain(){intresult=factorial(5);assert(result==120);}使用C-xC-s快捷键保存文件。现在文件已保存,是时候编译它了。按M-x,在弹出的提示符下输入compile并回车。然后在提示符下,将内容替换为g++-gbuggyFactorial.cpp并再次按回车键。图1:Emacs迷你缓冲区中的编译命令这将在Emacs中打开另一个缓冲区,显示编译状态。如果您的代码输入正确,您会看到图2中所示的缓冲区。图2:编译状态要隐藏编译缓冲区,首先确保您的光标位于编译缓冲区中(您可以将光标从一个缓冲区移动到另一个缓冲区C-xo快捷方式而不是使用鼠标),然后按C-x0。下一步是运行代码,看看它是否运行良好。按M-!快捷方式并在迷你缓冲区提示符下键入./a.out。图3:迷你缓冲区中代码的输出您可以看到迷你缓冲区中显示的断言失败。很明显代码有错误,因为5的阶乘是120。那么我们现在开始调试吧。使用GUD调试代码现在我们的代码已经编译,是时候看看哪里出了问题。按M-x快捷键并在提示符下输入gdb。在下一个提示符下,输入gdb-i=mia.out。如果一切顺利,GDB将在Emacs缓冲区中启动,您将看到图4中所示的窗口。图4:Emacs中的GDB缓冲区在gdb提示符下,键入breakmain以设置断点,然后键入r以运行程序。该程序将开始运行并在main()函数处停止。一旦GDB到达在main处设置的断点,将弹出一个新缓冲区,显示您正在调试的代码。注意左边的红点就是你设置断点的地方,并且会有一个小标志提醒你当前代码运行到哪一行。目前,标志位于断点处(图5)。图5:GDB和代码显示在两个单独的窗口中要调试阶乘函数,我们需要逐步执行它。为此,您可以在GBD提示符下使用GDB命令步骤,或使用Emacs快捷键C-cC-s。还有其他快捷方式,但我更喜欢GDB命令。因此,我将在本文的其余部分中使用它们。让我们在单步执行时注意局部变量中的阶乘值。参考图6设置局部变量值在Emacs框架中的显示。图6:在Emacs中使用独立框架显示局部变量逐步通过GDB提示并观察局部变量值的变化。在循环的第一次迭代中,我们发现了一个问题。这里相乘的结果应该是5,而不是4。本文到此就差不多结束了,读者可以自行探索发现GUD模式的新大陆。GDB中的所有命令都可以在GUD模式下运行。我将此代码的修复留作读者的练习。查看您可以在调试期间进行哪些自定义以使您的工作流程更轻松、更高效。