这两天,在调试Rails的时候,碰到一个极度奇怪的问题,困扰了我足足两天,实在让我头晕脑胀,耳晕目眩。。。。。。具体情况描述如下:
Rails框架的某一个地方使用了ActiveSupport::OptionMerger类,比如:ActiveSupport::OptionMerger.new(self, options)。但是,只要我通过单步进入到OptionMerger类initialize方法的时候,进程突然中止了,netbean的debug窗口提示一个错误:“can't dup NilClass”。但是,如果我不调试,直接F6运行程序的话,却跟啥事都没有一样通过了。调试和运行行为不一致?这个问题我在COM确实碰到过,但是现在Ruby里面,提示我这样的错误,我实在纳闷。。。试验了很多次,调试了很多次,未果~~灰头土脸,无计可施的时候,当代码运行到ActiveSupport::OptionMerger.new(self, options)时,我将netbean调试界面中的“局部变量”窗口切换到了“监视”窗口,再一F7~居然成功进入到了OptionMerger类的initialize方法,没有任何错误,程序顺利的运行了下去!线索!经过分析,得出了如下结论:
首先,我们先来看一看OptionMerger的全部代码
module ActiveSupport
class OptionMerger #:nodoc:
instance_methods.each do |method|
undef_method(method) if method !~ /^(__|instance_eval|class|object_id)/
end
def initialize(context, options)
@context, @options = context, options
end
private
def method_missing(method, *arguments, &block)
merge_argument_options! arguments
@context.send!(method, *arguments, &block)
end
def merge_argument_options!(arguments)
arguments << if arguments.last.respond_to? :to_hash
@options.merge(arguments.pop)
else
@options.dup
end
end
end
end
其中,关键问题所在是定义了此类后,马上执行了很多次undef_method操作,通过代码我们可以看出来,最终,OptionMerger类只剩下如下的实例方法:__id__,__send__,object_id,instance_eval,class。
后来,在创建一个OptionMerger类实例的时候,如果你想单步进入此类,而这个时候,恰好netbean的bebug窗口在“局部变量”的时候~嘿嘿~由于“局部变量”窗口有一个默认的self变量,要显示其类型和值,显示值的时候,我想netbean是默认调用self.to_s方法,但是前面讲了,to_s方法已经被咔嚓了,所以,这时将触发method_missing,而method_missing又调用了merge_argument_options方法,而更巧的是,这个时候,options参数正好又是nil,所以,这个时候@options.dup这句话,让netbean歇菜了~这也是每次我想调试进入此类时,就over了的原因。
不知道这应该算是netbean的Bug还是Rails的Bug。。。不管怎么样,记得,在这种情况下,不要让调试窗口保持在“局部变量”窗口就是了,并且,“监视”窗口一定不能监视self变量,不然就会像我一样郁闷的~
分享到:
- 2008-03-18 15:08
- 浏览 1662
- 评论(2)
- 论坛回复 / 浏览 (2 / 2216)
- 查看更多
相关推荐
netbeans配置及xdebug 调试 单元调试 单独流程调试
如何使用Netbeans调试J2ME应用程序.rar
一共分两卷,这是第一部分。 Written for Java™ developers of varying skill and familiarity with the open source NetBeans™ IDE as well as Java IDEs in general, Pro NetBeans™ IDE 5.5 Enterprise ...
Gestion-学生-Netbeans-Swing:Gestion学生-Netbeans摇摆
netbeans-样品 Netbeans 平台示例 在这里,您将找到完整的基于 Netbeans 平台的应用程序演示,了解如何完成不同的标准应用程序功能。... 这只是一个非常简单的示例,可以使用一些可用性改进。 从肮
一个NetBeans IDE插件,添加了Markdown支持。 编辑Markdown文档时,此插件提供基本的语法突出显示,HTML预览和HTML导出。什么是降价? Markdown是面向Web作家的文本到HTML转换工具。 Markdown允许您使用易于阅读,...
AffableBean:Sistema电子商务做教程,门户做NetBeans(链接:https:netbeans.orgkbdocsjavaeeecommerceintro_pt_BR.html)
Apache NetBeans网站该存储库在不同的子目录中针对不同的子域进行结构化。 Apache NetBeans主网站随着Oracle批准捐赠,将通过内容逐渐增强。 迁移所有内容后,它可能会变成 对“主”的更改将自动发布到 (有关详细...
这是一个使用 NBM Maven 插件构建的 Maven 项目 - 只需检查并构建。 上可以通过 NBM 下载对其进行连续构建。 要在 NetBeans 中安装,只需使用 Tools | 下载和安装即可。 已下载选项卡上的插件。 待办事项 身份验证...
NetBeans Ruby and Rails IDE with JRuby 2009,大家看标题就知道了啊。。好东西啊,刚得到就发上来了。。
NetBeans,XDebug调试PHP教程
Title: Java EE 7 Development with NetBeans 8 Author: David R. Heffelfinger Length: 362 pages Edition: 1 Language: English Publisher: Packt Publishing Publication Date: 2015-01-30 ISBN-10: 1783983523 ...
一步一步教你用netbeans做程:用惯了MyEclipse,突然上面说要用netbeans进行开发,天啊,难的感觉从天而降,看看入门,其实相关性蛮大的,挺容易的,而且netbeans还是中文开发哦!
Apache NetBeans是一个开源开发环境,工具平台和应用程序框架。 建造状态 GitHub动作 TravisCI: Apache Jenkins: Linux: 视窗: 要求 吉特 蚂蚁1.9.9或以上 JDK 8或11(用于构建NetBeans) JDK 9或更高版本...
php调试之Netbeans + xdebug 配置全攻略,解决遇到Netbeans总是提示”正在等待连接”错误。
Apache 现在将 Netbeans 分发为 zip,这不方便 Mac 使用。 这是 Netbeans 10 的捆绑版本,可以拖入应用程序并像普通 mac 应用程序一样使用。
离子-netbeans-插件一个用于使用开发出色的混合移动应用程序的netbeans插件,该插件具有适当的文档,可为Ionic标签元素提供自动完成功能。 该插件有助于将Ionic框架集成到netbeans中。 它显示了离子标签指令的详细...
netbeans-checkstyle fork 与 checkstyle 和 netbeans 8 的 v6.1.1 一起使用 建造 mvn clean install 您需要的两个 npm 文件将位于 netbeans-checksyle/netbeans-checksyle-library/target/netbeans-checkstyle-...
NetBeans项目 使用NetBeans进行Java编程以进行企业计算