0

我问是因为我无法使用谷歌找到任何东西。

我要调试org.Example。我想设置一个断点,然后恢复 VM 执行直到断点。org.Example只是一个虚拟的主要功能。

所以我确实有我的虚拟机,但我没有找到获取Location对象的方法。我将问题减少为无法获取ReferenceType对象。

我的问题:我有一个带有启动连接器的简单命令行调试器

我将类路径设置"<Project_DIR>\out\artifacts\javaDebugger_jar\*"为 VM,调试程序应该在其中运行。该javaDebugger_jar文件夹中有多个 JAR 文件,其中一个包含该org/Example.class文件。

如果我调用“vm.resume()”,程序将执行。我猜在“恢复”之前没有加载主类。

那么这里的程序是什么?如何确保类已加载,或者我是否需要在特定类的方法条目上设置断点(我知道如何),然后在“示例”类的方法条目上设置断点,可以设置断点。

我问是因为这似乎很愚蠢。有没有更好的办法?

4

2 回答 2

0

因此,经过一段时间的思考,这种行为是可以预料的。

我试图在加载任何(非 jdk)类之前设置断点。这根本是不可能的。

我需要注意主要方法的方法条目,然后设置断点。这表示:

org.Example已加载。加载该类所依赖的所有类文件。

我知道这仅适用于直接依赖的类。我不确定这是否适用于通过 aClass.forName或其他东西加载的 JDBC 驱动程序。

对我来说,这个解决方案就足够了。如果您对如何找到此类(动态加载的类)有补充,请也回答这个问题。

于 2017-12-10T19:34:53.010 回答
0

您可以通过虚拟机的事件请求管理器创建“类准备请求”,以便在准备类时得到通知:

    EventRequestManager erm = machine.eventRequestManager();
    erm.createClassPrepareRequest().enable();

当任何类在 VM 上准备好时,这将为您提供一个事件,无论它是如何加载的。如果您愿意,您可以设置一个过滤器,以便它只通知特定的类。如果您依赖它以便在加载类时设置断点,您可能希望设置暂停策略。

于 2017-12-10T20:38:34.430 回答