这两天,在调试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
- 浏览 1718
- 评论(2)
- 论坛回复 / 浏览 (2 / 2234)
- 查看更多
相关推荐
netbeans配置及xdebug 调试 单元调试 单独流程调试
- **使用IRB**:Interactive Ruby Shell (IRB) 是一个强大的交互式Ruby解释器,NetBeans集成此功能。 #### 五、操作Rails项目 - **设置Rails项目**:配置Rails项目的细节,如数据库设置等。 - **操作数据库**:...
安装完成后,启动NetBeans并创建一个新的J2ME项目。在"新建项目"对话框中,选择"移动和嵌入式"类别,然后选取"J2ME MIDlet Suite"模板。 接着,填写项目的名称和位置,设置MIDlet(主应用程序)的名称和显示名称。...
而Netbeans是一个支持多种编程语言的IDE,对于C/C++的开发有着良好的支持。 描述中提到,通过在Linux环境下使用Netbeans 5.5.1,开发者可以更有效地理解和调试Asterisk的源代码,而不是手动逐个文件分析。这种方法...
对于PHP开发者来说,一个强大的集成开发环境(IDE)加上一个高效的调试器是非常重要的工具组合。本文将详细介绍如何在Netbeans中配置Xdebug进行PHP调试,并解决在配置过程中可能遇到的“正在等待连接”的问题。 ###...
NetBeans IDE 8.0 for Linux 是一个专为开发人员设计的强大集成开发环境(IDE),尤其适用于编写Java应用程序。此版本特别针对Linux操作系统进行了优化,提供了丰富的功能集,旨在提高在Linux平台上的开发效率。 ...
一共分两卷,这是第一部分。 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 ...
首先,Xdebug是一个开源的PHP扩展,它提供了调试和分析功能,能够帮助开发者更好地追踪代码中的错误和性能瓶颈。在使用WAMP作为本地服务器时,我们通常会安装Apache、PHP和MySQL的组合。 Xdebug的安装和配置步骤...
通过学习和实践这些配置步骤,你将能够更高效地在Netbeans中调试和开发基于Jetty的Maven项目,提升你的开发效率和问题排查能力。记住,实践是最好的老师,不断尝试和调试会让你对这个流程更加熟练。
- NetBeans有一个活跃的开发者社区,提供了大量的教程、论坛讨论和问题解答,帮助新用户快速上手。 - Oracle官方文档提供了详细的使用指南和API参考,是学习和解决问题的重要资源。 总之,NetBeans IDE 8.2是...
Apache组织接管了NetBeans项目后,将其转变为一个开源项目,这意味着代码对所有人开放,开发者社区可以贡献自己的力量,共同推动NetBeans的进步。 在描述中提到,由于Apache现在以zip格式分发NetBeans,对于Mac用户...
netbeans-样品 Netbeans 平台示例 在这里,您将找到完整的基于 Netbeans 平台的应用程序演示,了解如何完成不同的标准应用程序功能。... 这只是一个非常简单的示例,可以使用一些可用性改进。 从肮
Ubuntu 是一个流行的 Linux 发行版,而 Netbeans 是一个功能强大的集成开发环境(IDE)。在本文中,我们将指导您如何在 Ubuntu 20.04 上配置 Netbeans 8.2。 标题解释 Ubuntu 配置 Netbeans 8.2 是指在 Ubuntu 操作...
而NetBeans作为一个功能强大的集成开发环境(IDE),为开发者提供了便利的开发工具。当两者结合,即Hibernate for NetBeans 6.1,它为开发者带来了更高效、更直观的Java持久层开发体验。 标题"hibernate for ...
一个NetBeans IDE插件,添加了Markdown支持。 编辑Markdown文档时,此插件提供基本的语法突出显示,HTML预览和HTML导出。什么是降价? Markdown是面向Web作家的文本到HTML转换工具。 Markdown允许您使用易于阅读,...
它提供了一个丰富的功能集,如代码编辑、调试、版本控制和项目管理,使开发过程更为便捷。 ### 连接MySQL 1. **安装JDBC驱动**:MySQL连接需要JDBC驱动(也称为Connector/J)。确保你已经下载并安装了适合NetBeans...
Apache NetBeans网站该存储库在不同的子目录中针对不同的子域进行结构化。 Apache NetBeans主网站随着Oracle批准捐赠,将通过内容逐渐增强。 迁移所有内容后,它可能会变成 对“主”的更改将自动发布到 (有关详细...
1. NetBeans IDE 基本概念:NetBeans IDE 是一个集成开发环境(IDE),它提供了一个完整的开发环境,包括项目管理、代码编辑、编译、调试和运行等功能。 2. 创建 Java 项目:在 NetBeans IDE 中,可以通过新建项目...