Google SoC 系列: 基于 Web 的 Rails 调试器

  • Werner Schuster
  • 宋玮

2007 年 4 月 27 日

话题:RubyRuby on Rails语言 & 开发

Rails 调试工具已经存在很长时间了。最简单的方法是在你的代码中放置

breakpoint

代码;当这一行被执行时,Rails 允许将 irb(Ruby 的交互式 shell)缚到 Rails 进程上,以查看系统。其他工具、IDE 也都开始提供 Ruby 与 Rails 的调试支持以及 Ruby 调试器的 GUI 前端。Eugen Minciu创建了一个 Google Summer of Code(SoC)项目,以改进有关调试 Rails 的工作流程。InfoQ 第一时间从 Eugen 那儿了解到了他的计划细节。当被问到该项目的概观时,Eugen 表示:

正如我的项目摘要所指出的,这个项目致力于增强 Rails 应用的调试能力。我对开发一个完整的 Ruby 调试器没有兴趣,因为有些项目已经涉及了这一题目。相反,我想要在浏览器上创建调试会话。这也是在为 Rails 调试过程中普遍遇到的断点问题找到一个解决方案。因此,我想创建一个基于 Web 的调试会话,可以让开发者在发生任何错误事件时检查变量。此外,无论何时,只要你的 Rails 应用在执行过程中遇到了一个异常或设置的断点,你都将自动地获得这样一个会话(或至少是一个连接到该会话的链接)。这是我玩 Lisp 时得到的灵感,Lisp 可以在程序一遇到错误时就立即让你检查。这是一个很好的工作流程,我在做 Rails 应用时也想拥有同样形式的工作流程。

当被问到如何部属这种工具时,Eugen 说到:

“后端”(the part that enables the Binding.of_caller,激活 Binding.of_caller 的部分)应该以 gem 方式提供,因为它用途广泛,即便你不想把它集成到你的应用中,它也可以提供给其他应用使用。我更喜欢把其打包成一个 gem,因为这样,开发者在一台机器只需下载一次(更新一次),而无需在同一台为每个应用都下载一次。可是,如果这不可行的话,我将把该项目的“前端”部分做成一个插件。

解释一下,Ruby 的 Binding 类对象封装了 Ruby 代码的上下文。“Binding”是一个计算机术语,是符号 / 名称对应到具体对象的一种映射。调用捕获与维护 binding 的专用方法,或者只是简单的调用获取 binding 的专用方法,对调试器这样的工具来说都是必须的。例如,调试器使用这些方法来显示挂起程序的调用栈,以及允许检查方法栈帧的变量等操作。

提到基于 Web 的 Rails 调试,已经有一个叫做Gyre的项目了。Gyre 是一个以 Web 应用方式实现的 IDE。它允许在浏览器中查看 Rails 应用程序的源码,并很容易设置断点。它目前还处于 alpha 版本阶段。Eugen:

我必须承认,直到最近我才听说 Gyre,我找到了它并看过界面,它看起来很漂亮。可是,将 Web 应用的运行与调试分开这种工作流程听起来不怎么好,而且通过浏览器设置断点这种功能并不是一个能真正打动我的很酷的事情。但 Gyre 的控制台看起来确实相当漂亮,我得看看它是怎么实现的,做自己这个项目过程中,我很愿意与更多的人员交流,我会和他们联系的。

这个项目第一步将在类似于“Try Ruby”的平台上进行工作。“Try Ruby”是 Ruby irb 一个基于 Web 的版本,可以快速体验 Ruby 代码。Eugen:

它能很好地提供一些基于 Web 的 GUI 来控制应用程序执行流(单步跟踪,watch 等等),同时也能在同一屏幕的某个单独区域看到源码。我已经考虑过可行性,但要等到我完成类似 irb 控制台的功能后再来考虑这个问题。

有些想法可能来自Smalltalk Seaside 这个 Web 框架。Seaside 允许用 HTML GUI 组件编制程序,允许组件在调试时具有特殊的上下文菜单("Halos"),以便检查组件的状态。但这对 Rails 来说或许是不可能的,Euge 对这些想法报以开放的态度:

至于像 Seaside halos 这样的东西……我不知道,我不能想象它是怎么实现的。Seaside 在 Web 应用框架上走的是截然不同的方向。Rails 没有像“组件”那样的东西,所以我不知道如何为视图的各个不同部分提供一个特殊的上下文菜单。每个视图有一个上下文菜单是很挺好,但是我还没有想过要往这些菜单里放些什么。不过我很乐意尝试来自任何人的任何想法。

Eugen 的博客可以看到这个项目进展情况。

查看英文原文:Google SoC Series: Web-based Rails Debugger 
译者简介:宋玮,多年软件开发经验,从 2002 年开始就使用 Java,在各个项目开发过程中先后使用过 Struts、Oracle ADF、AspectJ 等。最近正在使用 Spring 及 Ruby on Rails,对敏捷方法有比较大的兴趣并做过一些尝试。他的 blog 为http://www.donews.net/victorsong。为 InfoQ 中文站贡献内容,请邮件至china-editorial@infoq.com
RubyRuby on Rails语言 & 开发