【问题标题】:Java debugger interface (JDI) - How to set a breakpointJava 调试器接口 (JDI) - 如何设置断点
【发布时间】:2017-12-10 15:33:08
【问题描述】:

我之所以问,是因为我无法使用 Google 找到任何东西。

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

所以我确实有我的虚拟机,但我没有找到访问Locationobject 的方法。我将问题简化为无法获取ReferenceTypeobject。

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

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

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

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

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

【问题讨论】:

    标签: java debugging jdi


    【解决方案1】:

    所以经过一段时间的思考,这种行为是预料之中的。

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

    我需要注意 main 方法的 methd 条目,然后设置断点。这意味着:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        相关资源
        最近更新 更多