3

我现在正在尝试学习 ruby​​-debug gem,但是有很多行话我无法赶上。想知道是否有人可以帮助解释?

我也无法在http://bashdb.sourceforge.net/ruby-debug.html中找到它们。作者假设我们已经了解它们(无论如何我在哪里可以了解它们?)。

例如这里是调用help framerdb 的结果。我无助地不理解我加粗的所有项目。

将当前移动到指定的号。

负数表示距离另一端的位置。所以'frame -1'移动到最旧的帧,'frame 0'移动到最新的帧。

如果没有参数,该命令将打印当前堆栈帧。由于重新显示当前位置,如果有前端也在监视事物,它可能会触发重新同步。

如果给定线程编号,那么我们将评估 表达式的上下文设置为该线程的该帧。

4

2 回答 2

5

这不是特定于 Ruby 的行话。大多数调试都很常见。

关于堆栈帧

您可能已经看到堆栈跟踪:

/usr/local/rvm/gems/ree-1.8.7-2010.02/gems/redgreen-1.2.2/lib/redgreen.rb:28:in `write': Broken pipe (Errno::EPIPE)
from /usr/local/rvm/gems/ree-1.8.7-2010.02/gems/redgreen-1.2.2/lib/redgreen.rb:28:in `output_single'
from /usr/local/rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:72:in `add_fault'
from /usr/local/rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:70:in `to_proc'
from /usr/local/rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/test/unit/util/observable.rb:78:in `call'

完整的跟踪向您显示“调用堆栈”。顶部的行是引发异常的位置,它下面的行显示了程序到达该点所经过的代码路径。这些行中的每一行都是堆栈中的一个级别,称为“堆栈帧”。因此,当抛出异常时,当前堆栈帧是堆栈的顶部。如果你搬到frame -1然后您将移至调用堆栈的底部。把调用栈想象成一堆盘子。当你调用一个函数时,你将一个盘子添加到堆栈中,当你从那个函数返回时,你从堆栈中删除一个盘子。每个盘子都是一个框架。由于您通常最终在函数内的函数内调用函数,因此您最终会得到相当深的调用堆栈,并且在调试中上下遍历它们可能很有用,以评估调用堆栈中每个点的局部变量和状态。

如果您想了解更多关于调用堆栈的信息,维基百科有一篇不错的文章

关于线程

大多数现代编程语言都是多线程的,这意味着它们可以(几乎)同时执行多个代码路径。因此,例如,假设您有一个可视化应用程序,并且您执行一些昂贵的计算。当计算正在运行时,您的 GUI 将无法对任何用户输入做出反应,这使得应用程序对用户来说似乎被冻结了。您可以通过运行两个线程来解决这个问题:一个线程负责接受和处理用户输入并绘制 GUI,另一个线程负责进行繁重的计算。您的计算线程可能会陷入昂贵的循环中,并且您的 GUI 线程将继续运行并绘制 GUI。

如果您正在运行多线程应用程序,那么您必须选择要在哪个线程中评估您的调试命令(表达式),因为每个线程将位于代码的不同点,并且将具有不同的调用堆栈和不同的局部变量和状态等。这是评估上下文。

但是,我注意到这是一个 Rails 问题,并且 Rails(默认情况下)是单线程的,因此您不必担心线程。

于 2010-08-28T09:43:52.357 回答
1

Chris Heald 给出了一个非常棒的答案。一些非常小的评论。尽管 Ruby Rails 可能是单线程的(默认情况下),但根据您运行 Ruby/Rails 的 Web 服务器类型,整个程序(Web 服务器 + Ruby/Rails)可能不再是单线程的。

评论:

由于重新显示当前位置,如果有前端也在监视事物,它可能会触发重新同步。

有一些调试前端会解析输出,在输出中寻找源代码位置,以便前端(例如文本编辑器 GNU/Emacs)可以显示您所在的位置。(对于 GNU/Emacs,它会在另一个编辑器窗口中显示。)当您更改为不同的框架时,该前端需要更新显示您所在位置的显示。

尽管我知道 Emacs 和旧的调试器前端 ddd 就是这种情况,但我想如果您从 vim 进行调试,您也会遇到同样的事情。

于 2010-08-28T18:27:01.167 回答