被低估的内置功能:Grand Unified Debugger

Lobsters Hottest 工具

摘要

本文重点介绍了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) ``` 虽然我们不会直接使用这个命令行界面,但如果你愿意也可以用它。 我们来设置一些断点。 ![通过点击边缘设置 GDB 断点](https://tusharhero.codeberg.page/media/gdb-fringe-breakpoint.webm) 没错,你只需点击边缘(文本左侧的区域),就能自动设置断点,它们会显示在 `*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) ``` 现在,我们通过运行程序来开始调试。 ![工具栏中的运行按钮](https://tusharhero.codeberg.page/media/tool-bar-run-button.jpg) 这些按钮:“运行”(Run)、“下一行”(Next Line)、“步入”(Step Line)、“上栈”(Up Stack)和“下栈”(Down Stack)都位于工具栏中。 程序会立即停在遇到的第一个断点处(断点 3)。白色箭头表示当前正在执行的行。 ![当前行箭头](https://tusharhero.codeberg.page/media/fringe-current-line-arrow.jpg) 现在我们可以使用“步入”按钮进入 `fibo` 函数。 ![步入按钮](https://tusharhero.codeberg.page/media/tool-bar-step-line.jpg) 注意,现在多了一个“继续”(Continue)按钮,点击它会继续执行直到下一个断点。 于是我们关掉 `for` 循环中的断点。为此需要使用专门的断点管理窗口。 ![断点管理窗口](https://tusharhero.codeberg.page/media/breakpoint-gud-buffer.webm) 现在我们就连续猛按“继续”按钮。 ![连续点击继续按钮](https://tusharhero.codeberg.page/media/continue-button-spam.webm) 由于我们在 `for` 循环中调用了 `printf`,会弹出一个专门的 I/O 窗口(注意它不仅仅用于输出)。 如果想查看当前 `n` 的值怎么办?实际上有很多方法。 ![通过悬停查看变量值](https://tusharhero.codeberg.page/media/tooltip-print-value-magic.webm) 你只需要把光标悬停在想要查看值的变量上……然后就能看到值了?:) 另一种方法是使用局部变量窗口: ![局部变量窗口](https://tusharhero.codeberg.page/media/gud-locals-window.webm) 但谁想手动跟踪呢?不如直接监视变量,这样它一变你就会收到更新。 ![监视变量(speedbar)](https://tusharhero.codeberg.page/media/gud-watch-speedbar.webm) ## 总结 我还想介绍更多功能,但可惜没有时间全部覆盖。也许我会写一篇“续集”,介绍更多功能以及 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: 这太酷了

X AI KOLs Following

Codex 的 Visualize 插件预览,通过构建交互式行星模拟器进行演示。

Emacs 的更多内置功能

Lobsters Hottest

一篇博客文章,介绍了Emacs中不太为人所知但实用的内置功能,延续了一个旨在提高原版Emacs功能可发现性的系列。

从零编写调试器

Hacker News Top

本文开启了一个使用Rust从零构建调试器的系列,首先介绍如何使用操作系统调试API附加到Windows进程。

精准调试基准:你的模型在调试还是在重写?

Hugging Face Daily Papers

# 论文页面 - 精准调试基准:你的模型在调试还是在重写? 来源:[https://huggingface.co/papers/2604.17338](https://huggingface.co/papers/2604.17338) ## 摘要 前沿大模型在测试通过率上表现优异,但在调试任务中的精准度却很低,暴露出功能正确与精准定位缺陷之间的鸿沟。与代码补全不同,调试需定位错误并做针对性修改。我们观察到,前沿大模型在调试时往往重写出正确却过度修改的代码。