硬编码“require'debug'”无法找到源文件

时间:2013-04-07 22:29:47

标签: ruby debugging

使用这个最小的ruby代码:

require 'debug'
puts

在一个名为的文件中,例如script.rb

如果我这样启动它:ruby -rdebug script.rb

然后在调试提示符上按l,我按预期获得列表

如果我改为正常运行ruby script.rb

按下l时,我得到:

(rdb:1) l
[-3, 6] in script.rb
No sourcefile available for script.rb

错误消息充其量只是误导:工作目录没有改变,文件肯定还在那里!

我无法找到有关此行为的文档(我在jruby和mri上都尝试过,行为是一样的)

我知道'调试器'和'撬',但它们提供了不同的用例:

我已经习惯了其他带有内置调试模块的脚本语言,这可以让我在代码中的任何地方放置一个语句,让我进入调试shell,检查代码,变量等......优点建立它是因为它可以随处使用,而不必为它设置环境,或者甚至当我在一台不属于我自己的机器上时

我显然可以通过始终使用-rdebug调用解释器并手动设置断点来解决此问题,但我发现这比替代更多

2 个答案:

答案 0 :(得分:2)

在查看调试源代码后,我找到了一种解决方法和修复:

解决方法可以是:

trace on
next
trace off
list

这样您就可以在不使用-rdebug重新启动解释器的情况下获取列表,但缺点是您将从跟踪中获得一些其他不需要的输出,并且只有在移动之后才能看到它一个陈述

修复问题:问题是SCRIPT_LINES__ Hash缺少当前文件的值...显然它只在tracer.rb内设置

我已经更改了line 161,并使用跟踪调用[] =的子类的子类更改了Hash,并且我无法挖掘实际执行代码的代码来自不同文件的函数

另外:我还没有找到一个积极使用这个模块的人(我在freenode上的#ruby,#jruby和#pry都问过),以及它使用function that is now obsolete的事实这让我对这个模块的维护状态有点悲观

尽管如此,我提交了一个pull request for the fix(实际上它非常愚蠢和简单,但除此之外,我需要更深入地了解这个模块,并可能重构它的某些部分......但是如果这样的话模块没有得到积极的维护,我不确定这是不是一件好事。

答案 1 :(得分:1)

我怀疑Ruby解释器没有能够在没有调试模块中的组件的情况下加载源文件。所以,没有-rdebug,无法访问源文件。我同意这是一个误导性的错误。 “未加载调试功能”可能会更好。