DDD—数据显示调试器

作者:Shay Rojansky
DDD—Data Display Debugger

如今,Linux 最常见的用途之一是作为程序开发的平台。构成这个平台的丰富的 GNU 软件套件是现有的最全面的开发环境之一。然而,这些工具的一个普遍特点既是它们成功的原因,也是它们与其他产品竞争时的弱点——基于字符或命令行的界面。

另一方面,基于字符的界面要求用户熟悉其复杂性。新用户通常会感到困惑,因为他们不知道神奇的命令和击键。因此,许多商业编程套件都提供了集成的基于窗口的环境。但这几乎总是严重限制了程序员对工具的使用——例如,可能无法在脚本中使用该工具。当新用户的获得或损失处于危险之中时,供应商认为这些限制是微不足道的牺牲。

Unix 环境长期以来缺乏免费提供的、图形化的、易于使用的编程工具。ddd 命令通过为 Unix 调试器 gdbdbx 提供图形用户界面,解决了图形工具的缺乏问题。

调试器是任何编程环境中必不可少的一部分,它提供两个基本功能

  1. 交互式运行程序,以便观察代码执行并测试错误

  2. 检查崩溃进程的 core dump

标准的 Linux 调试器是 gdb,即 GNU 调试器。gdb 提供了一种交互式的基于文本的方法来完成这两项任务,包括单步执行、断点、变量监视以及在功能完善的调试器中预期的其他选项。但是,gdb 不易于运行——需要大量的经验才能完全操作 gdb,即使这样,它也往往有些笨拙。ddd 应运而生——它是 gdb 调试器和 dbx 调试器的 X Windows 前端。

安装

ddd 的主页是 http://www.cs.tu-bs.de/softech/ddd/,最新版本(截至撰写本文时)是 ddd 2.1.1。ddd 需要 Motif 才能执行;但是,最新的版本显然可以使用免费的 Motif 克隆 Lesstif 编译并良好运行。此外,还提供了 Motif 的静态链接版本,尽管它是一个非常大的二进制文件,会占用大量内存。编译 ddd(或下载二进制文件)后,将二进制文件放置在方便的位置(例如 /usr/local/bin)。

概述

ddd 是一个前端——它不执行任何调试。相反,它将所有用户命令发送到正在运行的 gdb(或 dbx)进程。ddd 环境由四个重要的窗口组成

  1. “调试器窗口”包含 gdb 和 ddd 之间的实际通信。此窗口始终显示被调试程序的标准 I/O。

  2. “源代码窗口”包含程序源代码和基本的源代码调试操作。

  3. “命令工具窗口”包含您需要的大多数操作的按钮;堆栈向上和向下步进、设置断点等。

  4. “数据窗口”包含所有与数据相关的信息,例如变量和函数监视。

要使用 ddd,请编写一个程序并使用 gcc 命令和 -g 开关进行编译,以便包含调试信息。

gcc hello.c -g -o hello

然后运行 ddd。启动时,仅打开调试器控制台。您必须通过“文件”菜单打开可执行文件(或 core dump);然后,打开“命令工具窗口”和“源代码窗口”。如果您还希望操作数据,请通过“窗口”菜单打开“数据窗口”。

此时,您可以开始运行程序并诊断任何问题。首先,设置一个断点,即调试器应停止运行程序并等待指令的代码行。单击代码行,然后单击“Break at()”按钮设置断点;“红色停止标志”将出现在行旁边以标记断点。您可以随时通过单击行并按下“Clear at()”按钮来清除它。

通过单击“命令工具窗口”中的“运行”按钮开始运行程序。程序将执行,就像您在提示符下启动它一样,但在到达第一个断点时立即停止。现在,您可以通过两种方式之一逐行继续执行程序——“Step”和“Next”。“Step”执行代码行,如果该行是代码存在的函数,则“Step”进入函数代码并逐步执行它。“Next”执行函数并继续到下一行。请注意,“绿色箭头”标记要执行的行。在使用“Step”和“Next”在程序代码中移动一段时间后,您可以按下“Continue”按钮继续运行程序,直到到达下一个断点或程序结束(如果没有设置更多断点)。

执行部分代码和摆弄断点可能很好,但调试还有更多内容。调试的一个重要部分是观察程序如何操作数据。由于 ddd 是一个图形应用程序,因此它可以在数据可视化方面做出最大贡献。

通过打开“数据窗口”开始调试操作变量的程序。在调试过程中,通过用鼠标左键单击变量来选择变量,然后按下“Display()”按钮;变量及其值将出现在“数据窗口”中。执行任何修改该特定变量的代码行都会更改“数据窗口”中的表示。当然,您可以创建多个变量“监视”,甚至可以将它们定位在窗口中的任何位置。您可以通过在“数据窗口”中单击鼠标右键,然后选择“New Display”来创建函数监视。使用此选项,您可以输入任何有效的 C 表达式并对其进行求值。

变量和函数可视化对于 gdb 用户来说并不陌生。然而,ddd 中最令人惊叹的事情之一是可视化指针;例如,创建一个整数指针并使其指向一个整数。在指针上创建一个监视。在监视的内容部分,您将看到指向的整数的内存地址。单击内容,然后单击“Dereference()”按钮。此时,将创建一个新单元格,其中包含整数变量,并带有从指针到整数的箭头。进一步扩展这个概念意味着您可以图形化地可视化复杂的数据结构、结构、数组以及几乎任何您想要的东西。例如,图 1 显示了链表的源代码,而图 2 显示了它的 ddd 可视化。

图 1. 源代码窗口

图 2. 数据窗口

ddd 的另一个值得称赞的功能是其帮助系统——一种非常有用的上下文相关机制,可以通过按 f1,然后单击 ddd 中的任何内容来获得帮助。此外,可以从“帮助”菜单打开更完整和有条理的手册,提供带有示例的基于菜单的文本页面。

结论

ddd 具有比我在此处介绍的更多的功能;但是,本文应该为您提供一个良好的开端。令人耳目一新的是,看到 Unix 进入了现代时代,图形化前端不会限制用户。当我第一次发现 ddd 时,我对它对新手 Unix 程序员的潜力印象深刻。但是,即使我是一个完全“合格”的 Unix 黑客,并且有很多 gdb 的伤疤,我也发现自己经常启动它。ddd 的简洁性和优雅性将使即使是最顽固的 shell 狂热者也会在许多情况下屈服并接受它。

Shay Rojansky 是一位 18 岁的高中生,即将被征召入以色列国防军 (IDF),他希望在那里推广 Linux 作为操作系统。他有时在他的高中担任系统管理员(主要是 Linux)。可以通过电子邮件 roji@cs.haji.ac.il 与他联系。

加载 Disqus 评论