框架,线程和ruby-debug gem中的一些其他术语,它们是什么意思?

jay*_*ode 3 ruby ruby-on-rails ruby-debug

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

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

例如,这是help frame在rdb 中调用的结果.我无助地理解我加粗的所有项目.

将当前移动到指定的编号.

负数表示另一端的位置.因此'frame -1'移动到最旧的帧,'frame 0'移动到最新的帧.

如果没有参数,该命令将打印当前堆栈帧.由于当前位置再次显示,它可能触发再同步,如果有一个前端也守护着的东西.

如果给出了一个线程号,那么我们设置上下文来 计算该线程的那个帧的表达式.

Chr*_*ald 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'
Run Code Online (Sandbox Code Playgroud)

完整跟踪显示"调用堆栈".顶部的行是抛出异常的位置,它下面的行显示程序用来到达该点的代码路径.这些行中的每一行都是堆栈中的一个级别,称为"堆栈帧".因此,当抛出异常时,当前堆栈帧是堆栈的顶部.如果你搬到frame -1然后你移动到调用堆栈的底部.把堆栈想象成一堆盘子.当你调用一个函数时,你会在堆栈中添加一个盘子,当你退出该函数时,你会从堆栈中移除一个盘子.每个板都是一个框架.由于您通常最终会在函数内的函数内调用函数,因此最终会调用相当深的调用堆栈,并且在调试中上下移动它们非常有用,可以在调用堆栈中的每个点评估局部变量和状态.

如果你想在电话堆栈上阅读更多内容,维基百科有一篇很好的文章.

关于线程

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

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

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