【问题标题】:Hardcoded "require 'debug'" can't find the sourcefile硬编码“需要'调试'”找不到源文件
【发布时间】:2013-04-07 22:29:47
【问题描述】:

使用这个最小的 ruby​​ 代码:

require 'debug'
puts

在一个名为的文件中,例如脚本.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 调用解释器并手动设置断点来解决此问题,但我发现这比替代方法更有效

【问题讨论】:

    标签: ruby debugging


    【解决方案1】:

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

    解决方法可以是:

    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(它实际上非常愚蠢和简单,但要不然我需要对这个模块有更深入的了解,并且可能要重构它的某些部分......但如果这个模块是'没有积极维护,我不确定这是一件好事)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 所以,调试模块在开始读取文件时不可用......但只要require 'debug' 应该是,不是吗?我通过需要另一个文件并进入来测试您的假设:确实它有效,所以显然问题是调试模块无法正确初始化它被调用的相同上下文的数据你认为这应该报告为错误?
      猜你喜欢
      • 2012-10-03
      • 2015-09-29
      • 2012-04-13
      • 2022-08-13
      • 1970-01-01
      • 2010-09-26
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多