问题标签 [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 - Java VM 在 VMStartEvent 后挂起
VMStartEvent 后虚拟机挂在这一行
VM 使用suspend = false
. 我使用java 1.7
java - Java 反射与 Java 调试接口 (JDI)
使用 Java 反射和 Java 调试接口有什么区别?我什么时候可以使用一个,什么时候可以使用另一个?
java - Dispose JDI 在某些情况下会挂起
我正在使用 JDI,并发现调用 com.sun.jdi.VirtualMachine#dispose 会在某些情况下挂起。
线程堆栈是:
从反编译的代码中,我看到了这个:
这里好像有死锁,这是JDK的错误吗?我正在使用热点 JDK 7。
java 版本 "1.7.0_79" Java(TM) SE Runtime Environment (build 1.7.0_79-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, 混合模式)
jdi - 如何查看堆栈和寄存器
我想单步执行一个 Java 方法并查看本地程序堆栈和寄存器。例如,如果执行了 PUSH 指令,我想查看堆栈顶部的值、堆栈深度、该值下的值等。有没有办法在 Java 中捕获它?
jdi - 执行前如何设置断点
我想在应用程序开始运行之前在应用程序中设置一个断点,这样我就可以确保应用程序在启动时不会通过断点。
为了设置断点,您需要执行以下操作:
为了获取断点的位置,您可以执行以下操作:
为了获得方法,您可以执行以下操作:
但是,为了获得该类类型,您似乎需要一个似乎需要运行 JVM 的 ObjectReference。
有没有办法在应用程序JVM运行之前设置断点,以确保在应用程序启动期间不通过断点?
java - JDI、Java 字节码检测和 Java 代理(JWDP、JVMTI)
我是调试器、仪器和 JVMTI 领域的新手。所以我对他们没有几个问题。
JDI(Java 调试器接口)、JWDP、javaagent 和本机代理(JVMTI)有什么区别。以及 java 仪表 API 适合图片的位置。
我正在使用 JDI 来拦截目标 Java 应用程序中的异常。但是我发现如果我们谈论它如何影响目标应用程序的性能,JDI 还不够好。我读到大多数优秀的应用程序通过将 JVMTI 与字节码检测相结合来做到这一点。但我不明白字节码检测如何与 JVMTI 一起使用。那么,我们如何与 JVMTI 一起进行字节码检测呢?任何示例都会有所帮助。
我们可以在 java 中同时检测字节码和机器码吗?
静态字节码分析能否与 JVMTI 一起使用。如果是,那怎么办?
如果有任何问题无关紧要或错误,请告诉我。
javascript - 通过JDI的源代码
我正在尝试使用 Java 调试接口以编程方式调试 Nashorn 引擎。我得到jdk.nashorn.internal.scripts.Script$Recompilation$1$23A$\^eval\_
了堆栈框架,可以在这个框架中查看源位置。但是我想加载执行 JavaScript 源代码并且不知道该怎么做(没有 JS 文件,代码是通过直接eval
调用加载到引擎中的)。我知道 NetBeans 可以调试 JavaScript 并从 Nashorn 中提取 JS 代码。它使用什么魔法?
java - Java:方法挂钩和查找对象实例
情况
你好,我有2个问题。
情况是我正在为 Windows 编写一个 Java API,它还提供了将代码注入进程然后操作目标的工具。我已经实现了injection-part,例如将一个 jar 注入另一个 jar。此时我的 jar 被调用(而目标已经在运行时)并在一个完整的静态上下文中启动。
目标和问题
从这里我有两个目标:
- 我想与目标对象交互,因此我需要引用。对于许多对象来说,这已经成为可能,因为它们提供对其实例的静态访问。例如awt.Frames#getFrames()提供对所有创建的 Frame 对象的访问。但是如果有可能访问堆上的任意对象,那就太棒了。类似“ Heap#getAllObjectInstances() ”的东西。
- 给定一个对象实例,我想连接到该对象的任意函数。例如,每当调用BufferStrategy#show()时,我希望它首先调用另一个方法。
所以我将问题总结如下:
- 如何从静态上下文中获取任意对象引用?
- 如何连接任意函数?
评论
到目前为止我所做的,评论和想法:
- JDI (Java 调试器接口)通过VirtualMachine#allClasses() -> ReferenceType#instances(0)提供了这样的方法。但是 JDI 需要使用额外的调试参数来启动目标 JVM ,这对我来说是没有选择的。可以深入到低级别并使用内存工具分析堆,但我希望有人知道更高级的方法。使用 Windows API 对我来说是一种选择,因为我熟悉JNA/JNI,但我不知道这样的工具。
- 最后的手段是使用IAT与 C 代码挂钩,这是一种非常低级的方法,我想避免这种. 我可以假设此时有一个对象引用,也许反射 API是否提供了一种更改对象方法的方法?或者至少简单地提供一个挂钩机制?
请注意,更改目标代码当然不是我的选择。并且它已经在运行时,因此 ByteCode-Manipulation 也可能是一种选择。
设想
这会派上用场的场景:
目标是一个游戏,部署为 jar。它使用BufferStrategy类以Double-Buffer-Strategy呈现。它使用BufferStrategy#show()显示图像。我们将我们的 jar 注入到游戏中,并喜欢绘制带有附加信息的叠加层。为此,我们获得了对使用过的BufferStrategy的引用并连接到它的show方法。这样每次调用时它都会调用我们的 drawOverlay 方法,然后我们传回原始的show-method。
java - Java 进程连接到它自己的调试器接口
在 Java 进程中,我想访问同一进程的 JDI(Java 调试接口)。
我做出以下假设:
- 该进程正在调试器中执行(在 Intelli/J 中)
- 我使用 Oracle JVM 8
- 我运行 Linux(不需要可移植性)
也就是说,我想做类似的事情:
(当然,除了没有这样的对象。)
如何连接到我自己的虚拟机?
我为什么要那个?
我希望编写一个函数,通过它的唯一 IDfindObj
找到一个对象。例如,如果在 Intelli/J 调试器中我看到一个变量“ ”,那么我希望能够添加一个查找并返回对象的监视表达式“”。这样,即使在更改变量或离开当前堆栈帧之后,我也将能够看到对象 #1234 。x = {Something@1234}
findObj(1234)
x
我相信一旦我可以访问当前进程的 JDI,我就可以实现这个功能。
[编辑:它没有回答问题,但它解决了我的用例:在 Intellij/J 中,您可以“标记”对象,并在监视表达式中使用这些标记。]
我尝试了什么?
在调试会话中启动 Java 进程时,我尝试使用 Intelli/J 在参数中提供的主机名和端口通过 SocketAttach AttachingConnector连接到进程本身。-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:39469,suspend=y,server=n
(大致遵循此处描述的方法。)我得到:
可能是因为 Intelli/J 已经连接并且无法连接到该端口两次?[编辑:Intellij/J 使用参数启动 jwdp 代理,server=n
这意味着该进程将进行连接。因此连接被拒绝。但进一步的实验表明,即使一个使用server=y
,最多只能接受一个连接。]
另一种方法是使用 ProcessAttach AttachingConnector。在这种情况下,我得到:
java - 我可以在 Maven Central 上上传 tools.jar 吗?
我的应用程序使用 JDI 调试器类,它们位于tools.jar
. Maven
我希望使用(即创建一个)将应用程序打包为独立的foo-with-dependencies.jar
。
但是,tools.jar
不在 Maven Central 上。
Stack Overflow 上的流行解决方案无效,因为<scope>system</scope>
阻止tools.jar
放入foo-with-dependencies.jar
.
Maven 中心没有 tools.jar 是否有任何许可原因?可以上传tools.jar
吗Maven Central
?