问题标签 [jdi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
545 浏览

java - 你如何获得一个实例的封闭实例?(com.sun.jdi)

com.sun.jdi是一个包,可让您获取有关正在运行的 VM 的信息、添加断点、查看堆栈帧等。

如何获取另一个实例的封闭实例?例如,这里有一些代码创建了内部类 Garfield.Lasagna 的 4 个实例,其中两个分别被不同的 Garfield 实例包围。

我想com.sun.jdi.ObjectReference将有办法获取包含实例的实例,但似乎并非如此。

或者,我会尝试在调试的 VM 中使用反射,例如java.lang.Class.getEnclosure{Class,Constructor,Method}()但我没有看到任何适用于对象/实例的相关方法。

0 投票
1 回答
847 浏览

java - 在 Java 调试器接口 (JDI) 中调用静态方法

在JDI中,有一个方法

调用目标(调试对象)VM 中的方法。

但是我怎样才能调用静态方法呢?在这种情况下,我没有对象引用。

TIL Java 允许您在 null 上调用静态方法,但这在这里不起作用。

有意义的是

但是不存在这样的事情,我也无法通过任何其他方式找到解决方法。

0 投票
1 回答
816 浏览

java - 在哪里可以找到 com.sun.jdi 包的源代码?

我想看看如何使用 jdi 调试 java 代码,但我不知道从哪里获得有关它的源代码。是在jdk里吗?我已经使用eclipse在jdk中导入src.zip,但似乎不包含关于jdi的信息,我在哪里可以找到它?

0 投票
2 回答
123 浏览

java - 如何记录/监控java字段赋值操作

如何记录/监控java字段赋值操作;例如,我想在赋值操作之前或之后添加一些函数;

原始代码:

更改代码后:

NOTE:我想在每个提交的分配行之前或之后进行检测;所以它不能手动指出哪条线应该是仪器

是否可以使用 JAVA 调试接口?或者有什么方法可以达到它仪器或动态代理

0 投票
1 回答
903 浏览

java - 如何从插件访问 Eclipse Java 调试器?

我正在为 Eclipse 平台开发一个插件。该插件将用于提供有关当前正在调试的 Java 源代码行的信息。

在调试 Java 程序时,当您遇到断点时,Eclipse 会切换到标准的 Debug 透视图。在这个透视图中,除了标准的控制台输出、堆栈跟踪和其他各种视图之外,您还可以看到当前正在调试的 Java 程序的源代码。在此“源代码视图”中,您可以看到突出显示的行,这是当前正在调试/评估的代码行。这个突出显示的代码行是我想要访问的。

假设我知道调试器何时运行(我通过实现的 DebugBreakpointListener 类评估IJavaBreakpointListener),我需要向调试器“提问”。我想,我需要的是以某种方式直接向调试器询问它当前突出显示/调试/评估的代码行或所述代码行的行号。

我正在对 JDIDebugModel 进行静态访问以添加 Java 断点侦听器:

我以为我可以使用静态引用访问调试器,JDIDebugPlugin但我还没有找到我正在寻找的东西。

研究论文的第 3 部分,作者建议:

Eclipse Java 调试器建立在 Java 调试接口 (JDI) 的 API 之上,它是 Java 开发工具包的一部分。此 API 支持添加请求以监视 JVM 事件,例如 BreakpointEvent。当事件发生时,调试器会收到通知,并且可以获取发生此事件的线程。对于该线程堆栈跟踪中的每一帧,可以获得以下信息:

• 在该帧中执行的源Java 文件(如果源不可用,则为null)。

• 方法和行号(如果可用)。

• this 对象,如果方法是静态的,则为 null。

遇到断点时,Eclipse 调试器会使用此信息。它在“调试”视图中显示挂起线程的堆栈跟踪。对于此跟踪中选定的帧,Eclipse 在其源文件中突出显示相应的行号,并在“Variables”视图中显示此变量。

这个项目符号列出的东西正是我正在寻找的东西。

不幸的是,我找不到有关如何“插入”调试器的详细文档。

如果有人可以给我信息,给我指点信息或示例代码,或者向我提供 Eclipse JDI 项目中某人的联系信息,我将不胜感激。

提前致谢。

------更新和回答: ------

在 greg-449 的回答的帮助下,我做了我想做的事。这是我所做的:

我写的上述断点监听器实现了接口方法breakpointHit,如下:

使用保存在我的一个对象中的线程和断点对象的指针,我可以查询它们以获取有关帧堆栈状态、线程以及我遇到的特定断点的最新信息。我可以通过调用获取调试器当前正在调试的类的名称 dn 路径:

这正是我想要的。我想我将需要手动读取源代码文件,通过将“换行符”字符作为分隔符来通过标记器运行它们,并获取相应的标记来读取该特定行。

0 投票
1 回答
107 浏览

java - java.io.InputStreamReader 的 JPDA JDI ObjectReference

有没有办法从 JPDA JDI 检索字符串/文本ObjectReference of java.io.InputStreamReader

0 投票
1 回答
1040 浏览

java - Java 调试接口、Lambda 和行号

我在更新调试器以使用 Java 8 时遇到一些问题。请考虑以下程序,例如:

正如预期的那样,Java 8 将 lambda 编译为如下所示:

这看起来很像普通代码。但是,我正在尝试使用 Java 调试器接口 (JDI) 来拦截程序的每一步。出错的第一件事是当我处理ClassPrepareEvent event对应于 lambda 类的时候。问这个event.referenceType()给了我一些Lam$$Lambda$1.1464642111很酷的东西。但是随后调用a .allLineLocations(),这似乎与编译文件中的 the不一致。.referenceType()AbsentInformationExceptionLineNumberTable

看起来在 Java 8 中单步执行 lambda 体是可能的。但是有谁知道如何在 JDI 中完成它?

更新

  • .allLineLocations在类上调用时Lam,它确实反映了所有这些行号。
  • 当 JDIEvent在 lambda 类中发生时(例如,从步进),.sourceName()该位置的AbsentInformationException
  • 看起来jdk.internal.org.objectweb.asm.*正在做一堆与复制 lambda 相关的事情
  • 我不确定从源代码行到字节码的映射是否保存在 Java 或 JDI 中

所以我的工作假设是,当 lambda 的类在运行时创建时,JDI 需要做一些事情来识别新类的字节码来自旧类的字节码(而旧类的字节码又来自Lam.java)。我对内部表示的了解不够多,也不知道java.lang.Classcom.sun.jdi.ClassType哪里开始。

我为什么要这样做

0 投票
1 回答
2830 浏览

java - 通过 ObjectReference#invokeMethod 调用方法后出现 InvalidStackFrameException

我目前正在开发一个增强调试可能性的 Eclipse 插件。在调试会话期间,我通过以下方式调用 Scala 方法com.sun.jdi.ObjectReference#invokeMethod

之后,调用 toorg.eclipse.debug.core.model.IVariable#getValue会导致InvalidStackFrameException. 整个错误信息是:

Exception while retrieving variable's value当我在调用如上所示的方法后检查变量视图中的变量时,会显示该消息。

知道如何解决这个问题吗?我不明白为什么会有这么大的问题,因为 JDI 明确地提供了这样做的可能性。

更新:由于它可能是 Scala IDE 中的错误,因此在Scala IDE 开发组中有一个讨论和教程如何重现该问题。

0 投票
1 回答
3692 浏览

java - Eclipse:无法识别的选项:-g

我正在尝试使用 JVM 选项“-g”在 Eclipse 中启动一个应用程序,以便在使用 JDI 进行调试时能够查看所有线程信息。

但是,在开始时,Eclipse 提供以下内容:

我的 JVM 选项的完整列表:

其他信息:我正在使用 mac。

我非常感谢帮助解决这个问题,这样我就可以在不获取 JDI 中的 AbsentInformationException 的情况下进行调试。

谢谢,

院长

0 投票
2 回答
802 浏览

java - JDI - IllegalConnectorArgumentsException: Argument invalid

I am using the JDI to debug another running java application.

What I do that works:

  1. Run two applications using Eclipse. The debugger is launched with the following VM Options:

    /li>
  2. The other application connects to the socket at port 4000, and follows normal procedures (break points, etc.) to get a value of a Local Variable.

  3. Works properly and gives me that value.

What I want to do now:

Instead of using Eclipse to launch two processes, I launch one in Eclipse, and that Process uses a ProcessBuilder to launch another one with the following arguments:

The process starts successfully. However, when I try to access it through the first process, I get the following Error:

Looked this up online, and there is little information about what the Exception is.

I would appreciate any help figuring out what the problem is!