【问题标题】:When stepping into class instantiation, eclipse debugger goes to native code进入类实例化时,Eclipse 调试器转到本机代码
【发布时间】:2012-05-17 15:11:39
【问题描述】:

我最近升级到 helios,现在每次我进入一个类的构造函数(例如Cat myCat = new Cat();)时,eclipse 调试器都会将堆栈显示为

:

要获得实际的构造函数代码,我必须跳出几次,这很烦人。每个班级都会发生这种情况,尽管有堆栈,但我从未在控制台中看到任何错误消息。我该如何解决这个问题,以便它直接进入我的类的构造函数?

这只会在第一次使用该类时发生,即使对于与当前类位于同一 src 文件中的类也是如此。

【问题讨论】:

  • 这个类存在吗?看起来 ClassNotFoundException 正在被抛出......
  • 类肯定存在,调试器最终进入构造器,程序运行成功。

标签: java eclipse debugging


【解决方案1】:

Eclipse 在 Java 调试器首选项中有一个步骤过滤器首选项。它的默认首选项会过滤掉java.lang.ClassLoader,但这不起作用。这可能与最近安装并切换到使用 jre7 有关。为了解决我的问题,我添加了一个过滤器来单步执行 java.lang 包中的任何代码。

【讨论】:

    【解决方案2】:

    我认为 ClassNotFoundException 只是作为类加载的一部分发生 - 问题是您设置了一个断点以在抛出这些异常时触发。我的猜测是你的 Eclipse 版本默认开启了这个断点,而旧版本没有。

    查看this link,它报告了类似的问题并提供了解决方案,就是禁用该断点。

    (为了教鱼等等,谷歌搜索词是“eclipse debugger launcher$appclassloader”。)

    【讨论】:

    • 这确实是问题所在,并且在第一次调用尚未加载的类上的方法时发生。只需按 F7(返回)多次即可回到课堂 - 我发现通常需要按 8 次 F7 才能回到课堂。
    • 顺便说一句,我想知道你是否也可以通过在进入构造函数之前加载类来解决这个问题。例如,如果您在调试器中评估 Class.forName(Cat.class.getName()) 会怎样?
    • 任何加载类的东西都会绕过这个问题。
    • 如果使用 F5 进入构造函数,则不需要涉及断点。 “步入”将步入下一条指令。如果您正在调用构造函数并且该类尚未加载,那么接下来会发生 ClassNotFoundException(因此可以加载该类),这就是您将要进入的内容。
    • Eclipse 在调试时通常会过滤掉ClassLoader 代码,由于某种原因,升级后这不起作用。请参阅我的答案以获得解决方案。
    【解决方案3】:

    从 Eclipse 中报告的堆栈跟踪来看,ClassNotFoundException 似乎已初始化并被抛出,您编写的应用程序是否遇到任何问题?

    你在类的构造函数中设置断点了吗?你根本无法进入构造函数?

    您是使用Class.forname() 还是import 将类引入JRE?

    【讨论】:

    • 完全没有问题,我可以进入构造函数了。
    • 导入类没有什么特别的。
    【解决方案4】:

    似乎对于我的学生使用运行 openjdk 的实验室机器,解决方案是在 https://stackoverflow.com/a/10525351/1449799 中提到的相同首选项中添加一个步骤过滤器,但添加 jdk.*

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 1970-01-01
      • 2012-04-18
      • 2014-02-08
      • 1970-01-01
      • 2014-05-04
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多