`
woody_420420
  • 浏览: 42072 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

netbean调试ActiveSupport::OptionMerger需注意的一个问题

阅读更多
  这两天,在调试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变量,不然就会像我一样郁闷的~
分享到:
评论
2 楼 woody_420420 2008-03-20  
rainchen 写道
以前用netbean也有遇过类似问题,怎么也无法单步进某类内部。
只好手工断点,在console 一边next,一边list,也自得其乐

兄弟你太强了~console都搞出来了,那应该再一杯茶,一根烟,悠然南山中~~~
console调试太不方便了吧~处于研究学习目的应该还行
1 楼 rainchen 2008-03-19  
以前用netbean也有遇过类似问题,怎么也无法单步进某类内部。
只好手工断点,在console 一边next,一边list,也自得其乐

相关推荐

    netbeans配置及xdebug 单元调试 单独流程调试

    netbeans配置及xdebug 调试 单元调试 单独流程调试

    NetBeans Ruby and Rails IDE with JRuby 2009

    - **使用IRB**:Interactive Ruby Shell (IRB) 是一个强大的交互式Ruby解释器,NetBeans集成此功能。 #### 五、操作Rails项目 - **设置Rails项目**:配置Rails项目的细节,如数据库设置等。 - **操作数据库**:...

    如何使用Netbeans调试J2ME应用程序.rar

    安装完成后,启动NetBeans并创建一个新的J2ME项目。在"新建项目"对话框中,选择"移动和嵌入式"类别,然后选取"J2ME MIDlet Suite"模板。 接着,填写项目的名称和位置,设置MIDlet(主应用程序)的名称和显示名称。...

    部署asterisk项目到Netbeans进行实时调试(图解)

    而Netbeans是一个支持多种编程语言的IDE,对于C/C++的开发有着良好的支持。 描述中提到,通过在Linux环境下使用Netbeans 5.5.1,开发者可以更有效地理解和调试Asterisk的源代码,而不是手动逐个文件分析。这种方法...

    php调试之Netbeans + xdebug 配置全攻略

    对于PHP开发者来说,一个强大的集成开发环境(IDE)加上一个高效的调试器是非常重要的工具组合。本文将详细介绍如何在Netbeans中配置Xdebug进行PHP调试,并解决在配置过程中可能遇到的“正在等待连接”的问题。 ###...

    netbeans-8.0-linux

    NetBeans IDE 8.0 for Linux 是一个专为开发人员设计的强大集成开发环境(IDE),尤其适用于编写Java应用程序。此版本特别针对Linux操作系统进行了优化,提供了丰富的功能集,旨在提高在Linux平台上的开发效率。 ...

    NetBeans图书:Pro NetBeans IDE 5.5 Enterprise Edition

    一共分两卷,这是第一部分。 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 ...

    netbeans PHP开启xdebug的方法 wamp部署

    首先,Xdebug是一个开源的PHP扩展,它提供了调试和分析功能,能够帮助开发者更好地追踪代码中的错误和性能瓶颈。在使用WAMP作为本地服务器时,我们通常会安装Apache、PHP和MySQL的组合。 Xdebug的安装和配置步骤...

    Netbeans jetty maven项目调试配置

    通过学习和实践这些配置步骤,你将能够更高效地在Netbeans中调试和开发基于Jetty的Maven项目,提升你的开发效率和问题排查能力。记住,实践是最好的老师,不断尝试和调试会让你对这个流程更加熟练。

    netbeans-8.2,Linux,x64

    - NetBeans有一个活跃的开发者社区,提供了大量的教程、论坛讨论和问题解答,帮助新用户快速上手。 - Oracle官方文档提供了详细的使用指南和API参考,是学习和解决问题的重要资源。 总之,NetBeans IDE 8.2是...

    Netbeans10Mac:为 MacOSX 打包的 Netbeans 10-开源

    Apache组织接管了NetBeans项目后,将其转变为一个开源项目,这意味着代码对所有人开放,开发者社区可以贡献自己的力量,共同推动NetBeans的进步。 在描述中提到,由于Apache现在以zip格式分发NetBeans,对于Mac用户...

    netbeans-samples:Netbeans 平台示例

    netbeans-样品 Netbeans 平台示例 在这里,您将找到完整的基于 Netbeans 平台的应用程序演示,了解如何完成不同的标准应用程序功能。... 这只是一个非常简单的示例,可以使用一些可用性改进。 从肮

    Ubuntu配置Netbeans8.2

    Ubuntu 是一个流行的 Linux 发行版,而 Netbeans 是一个功能强大的集成开发环境(IDE)。在本文中,我们将指导您如何在 Ubuntu 20.04 上配置 Netbeans 8.2。 标题解释 Ubuntu 配置 Netbeans 8.2 是指在 Ubuntu 操作...

    hibernate for netbeans 6.1

    而NetBeans作为一个功能强大的集成开发环境(IDE),为开发者提供了便利的开发工具。当两者结合,即Hibernate for NetBeans 6.1,它为开发者带来了更高效、更直观的Java持久层开发体验。 标题"hibernate for ...

    flow-netbeans-markdown:对NetBeans IDE的Markdown文件支持

    一个NetBeans IDE插件,添加了Markdown支持。 编辑Markdown文档时,此插件提供基本的语法突出显示,HTML预览和HTML导出。什么是降价? Markdown是面向Web作家的文本到HTML转换工具。 Markdown允许您使用易于阅读,...

    Netbeans连接MySQL和SQL Server

    它提供了一个丰富的功能集,如代码编辑、调试、版本控制和项目管理,使开发过程更为便捷。 ### 连接MySQL 1. **安装JDBC驱动**:MySQL连接需要JDBC驱动(也称为Connector/J)。确保你已经下载并安装了适合NetBeans...

    netbeans-website:Apache NetBeans网站

    Apache NetBeans网站该存储库在不同的子目录中针对不同的子域进行结构化。 Apache NetBeans主网站随着Oracle批准捐赠,将通过内容逐渐增强。 迁移所有内容后,它可能会变成 对“主”的更改将自动发布到 (有关详细...

    NetBeans Java快速入门

    1. NetBeans IDE 基本概念:NetBeans IDE 是一个集成开发环境(IDE),它提供了一个完整的开发环境,包括项目管理、代码编辑、编译、调试和运行等功能。 2. 创建 Java 项目:在 NetBeans IDE 中,可以通过新建项目...

Global site tag (gtag.js) - Google Analytics