Java调试器接口(JDI) - 如何设置断点

时间:2017-12-10 15:33:08

标签: java debugging jdi

我在问,因为我无法使用Google找到任何内容。

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

所以我确实拥有自己的虚拟机,但我找不到找到Location对象的方法。我将问题简化为无法获得ReferenceType对象。

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

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

如果我打电话给&#34; vm.resume()&#34;程序将执行。我想在&#34;简历&#34;之前未加载主类。

那么这里的程序是什么?如何确保加载类或者我是否需要在特定类(我知道如何)的方法入口上设置断点,然后将断点设置为类&#34中的方法入口;示例&#34;断点可以设置。

我在问,因为这似乎是如此愚蠢。还有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

答案 1 :(得分:0)

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

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

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