问题标签 [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.
java - 你如何获得一个实例的封闭实例?(com.sun.jdi)
com.sun.jdi
是一个包,可让您获取有关正在运行的 VM 的信息、添加断点、查看堆栈帧等。
如何获取另一个实例的封闭实例?例如,这里有一些代码创建了内部类 Garfield.Lasagna 的 4 个实例,其中两个分别被不同的 Garfield 实例包围。
我想com.sun.jdi.ObjectReference将有办法获取包含实例的实例,但似乎并非如此。
或者,我会尝试在调试的 VM 中使用反射,例如java.lang.Class.getEnclosure{Class,Constructor,Method}()但我没有看到任何适用于对象/实例的相关方法。
java - 在 Java 调试器接口 (JDI) 中调用静态方法
在JDI中,有一个方法
调用目标(调试对象)VM 中的方法。
但是我怎样才能调用静态方法呢?在这种情况下,我没有对象引用。
TIL Java 允许您在 null 上调用静态方法,但这在这里不起作用。
有意义的是
但是不存在这样的事情,我也无法通过任何其他方式找到解决方法。
java - 在哪里可以找到 com.sun.jdi 包的源代码?
我想看看如何使用 jdi 调试 java 代码,但我不知道从哪里获得有关它的源代码。是在jdk里吗?我已经使用eclipse在jdk中导入src.zip,但似乎不包含关于jdi的信息,我在哪里可以找到它?
java - 如何记录/监控java字段赋值操作
如何记录/监控java字段赋值操作;例如,我想在赋值操作之前或之后添加一些函数;
原始代码:
更改代码后:
NOTE:
我想在每个提交的分配行之前或之后进行检测;所以它不能手动指出哪条线应该是仪器
是否可以使用 JAVA 调试接口?或者有什么方法可以达到它仪器或动态代理
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 路径:
这正是我想要的。我想我将需要手动读取源代码文件,通过将“换行符”字符作为分隔符来通过标记器运行它们,并获取相应的标记来读取该特定行。
java - java.io.InputStreamReader 的 JPDA JDI ObjectReference
有没有办法从 JPDA JDI 检索字符串/文本ObjectReference of java.io.InputStreamReader
?
java - Java 调试接口、Lambda 和行号
我在更新调试器以使用 Java 8 时遇到一些问题。请考虑以下程序,例如:
正如预期的那样,Java 8 将 lambda 编译为如下所示:
这看起来很像普通代码。但是,我正在尝试使用 Java 调试器接口 (JDI) 来拦截程序的每一步。出错的第一件事是当我处理ClassPrepareEvent event
对应于 lambda 类的时候。问这个event.referenceType()
给了我一些Lam$$Lambda$1.1464642111
很酷的东西。但是随后调用a .allLineLocations()
,这似乎与编译文件中的 the不一致。.referenceType()
AbsentInformationException
LineNumberTable
看起来在 Java 8 中单步执行 lambda 体是可能的。但是有谁知道如何在 JDI 中完成它?
更新:
- 当
.allLineLocations
在类上调用时Lam
,它确实反映了所有这些行号。 - 当 JDI
Event
在 lambda 类中发生时(例如,从步进),.sourceName()
该位置的AbsentInformationException
- 看起来
jdk.internal.org.objectweb.asm.*
正在做一堆与复制 lambda 相关的事情 - 我不确定从源代码行到字节码的映射是否保存在 Java 或 JDI 中
所以我的工作假设是,当 lambda 的类在运行时创建时,JDI 需要做一些事情来识别新类的字节码来自旧类的字节码(而旧类的字节码又来自Lam.java
)。我对内部表示的了解不够多,也不知道java.lang.Class
从com.sun.jdi.ClassType
哪里开始。
我为什么要这样做:
- 更新Java Visualizer以使用 lambda
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 开发组中有一个讨论和教程如何重现该问题。
java - Eclipse:无法识别的选项:-g
我正在尝试使用 JVM 选项“-g”在 Eclipse 中启动一个应用程序,以便在使用 JDI 进行调试时能够查看所有线程信息。
但是,在开始时,Eclipse 提供以下内容:
我的 JVM 选项的完整列表:
其他信息:我正在使用 mac。
我非常感谢帮助解决这个问题,这样我就可以在不获取 JDI 中的 AbsentInformationException 的情况下进行调试。
谢谢,
院长
java - JDI - IllegalConnectorArgumentsException: Argument invalid
I am using the JDI to debug another running java application.
What I do that works:
Run two applications using Eclipse. The debugger is launched with the following VM Options:
/li>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.
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!