被低估的内置功能:Grand Unified Debugger
摘要
本文重点介绍了Emacs内置的Grand Unified Debugger(GUD)的功能,强调了其多调试器支持和图形化GDB界面,包括通过点击边缘设置断点以及单步执行代码等功能。
<p><a href="https://lobste.rs/s/g6wquq/underappreciated_builtin_grand_unified">评论</a></p>
查看缓存全文
缓存时间: 2026/06/30 19:40
# 被低估的内置功能:Grand Unified Debugger
来源:https://tusharhero.codeberg.page/underappreciated-builtin-gud.html
*约 1089 字,阅读约需 5 分钟。*
## 目录
- [多调试器支持](#多调试器支持)
- [GDB 界面](#GDB 界面)
- [总结](#总结)
或者我更愿意称它为——**宏伟的**统一调试器(GLORIOUS Unified Debugger)。这是我对六月 Emacs 狂欢节([Underappreciated Emacs built-ins](https://rossabaker.com/blog/underappreciated-emacs-built-ins/))的投稿:那些被低估的 Emacs 内置功能。
## 多调试器支持
我主要使用它的 GDB 图形界面。但它支持多种调试器,例如:
- `lldb`(LLVM 调试器)
- `perldb`(Perl 调试器)
- `jdb`(Java 调试器)
- `pdb`(Python 调试器)
- `guiler`(Guile!)
- `dbx`(支持 C、C++ 等语言的调试器)
- `xdb`(MS Windows 调试器?)
- `sdb`(系统调试器)
## GDB 界面
手册中有一整个章节专门介绍 GDB 的图形界面。下面我来演示一下。
这是我们用的演示源文件 `fibo.c`:
```c
#include <stdio.h>
int fibo (int n) {
if (n < 2)
return 1;
else
return fibo (n - 1) + fibo (n - 2);
}
int main (void) {
for (int i = 0; i < 5; i++)
printf ("%d: %d\n", i, fibo(i));
}
```
首先,编译(`-g` 标志对于 GDB 调试是必需的):
```bash
gcc -g fibo.c -o fibo
```
现在有了编译好的程序,我们可以试运行:
```text
0: 1
1: 1
2: 2
3: 3
4: 5
```
接下来在 Emacs 中启动 gdb gud。方法是输入 `M-x gdb RET fibo RET`,这时会创建一个名为 `*gud-fibo*` 的缓冲区:
```text
Current directory is /home/tusharhero/Documents/c-scratch/
GNU gdb (GDB) 17.2
Copyright (C) 2025 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
...
Reading symbols from fibo...
(gdb)
```
虽然我们不会直接使用这个命令行界面,但如果你愿意也可以用它。
我们来设置一些断点。

没错,你只需点击边缘(文本左侧的区域),就能自动设置断点,它们会显示在 `*gud-fibo*` 中:
```text
Breakpoint 1 at 0x401138: file fibo.c, line 7.
Breakpoint 2 at 0x40113f: file fibo.c, line 9.
Breakpoint 3 at 0x401174: file fibo.c, line 16.
(gdb)
```
现在,我们通过运行程序来开始调试。

这些按钮:“运行”(Run)、“下一行”(Next Line)、“步入”(Step Line)、“上栈”(Up Stack)和“下栈”(Down Stack)都位于工具栏中。
程序会立即停在遇到的第一个断点处(断点 3)。白色箭头表示当前正在执行的行。

现在我们可以使用“步入”按钮进入 `fibo` 函数。

注意,现在多了一个“继续”(Continue)按钮,点击它会继续执行直到下一个断点。
于是我们关掉 `for` 循环中的断点。为此需要使用专门的断点管理窗口。

现在我们就连续猛按“继续”按钮。

由于我们在 `for` 循环中调用了 `printf`,会弹出一个专门的 I/O 窗口(注意它不仅仅用于输出)。
如果想查看当前 `n` 的值怎么办?实际上有很多方法。

你只需要把光标悬停在想要查看值的变量上……然后就能看到值了?:)
另一种方法是使用局部变量窗口:

但谁想手动跟踪呢?不如直接监视变量,这样它一变你就会收到更新。

## 总结
我还想介绍更多功能,但可惜没有时间全部覆盖。也许我会写一篇“续集”,介绍更多功能以及 GUD 支持的其他调试器。
联系我:将 `[at]` 替换为 `@`,并将域名和用户名互换:`sdf.org [at] tusharhero`
© tusharhero 2024–2026,详情请查看[许可证页面](https://tusharhero.codeberg.page/licenses.html)。
日期:2026-06-30 周二 00:00
Emacs (https://www.gnu.org/software/emacs/) 30.2(Org (https://orgmode.org/) 模式 9.7.11)
相似文章
@gdb: 这太酷了
Codex 的 Visualize 插件预览,通过构建交互式行星模拟器进行演示。
Emacs 的更多内置功能
一篇博客文章,介绍了Emacs中不太为人所知但实用的内置功能,延续了一个旨在提高原版Emacs功能可发现性的系列。
从零编写调试器
本文开启了一个使用Rust从零构建调试器的系列,首先介绍如何使用操作系统调试API附加到Windows进程。
@gdb:一种强大且酷的网站导航方式,让交互更直观、更具沉浸感
OpenAI 推出新的文档代理,帮助开发者快速找到答案并直接导航至相关文档,使网站交互更直观。
精准调试基准:你的模型在调试还是在重写?
# 论文页面 - 精准调试基准:你的模型在调试还是在重写? 来源:[https://huggingface.co/papers/2604.17338](https://huggingface.co/papers/2604.17338) ## 摘要 前沿大模型在测试通过率上表现优异,但在调试任务中的精准度却很低,暴露出功能正确与精准定位缺陷之间的鸿沟。与代码补全不同,调试需定位错误并做针对性修改。我们观察到,前沿大模型在调试时往往重写出正确却过度修改的代码。