Tag: jdi

Java访问本地变量名称

我正在编写一个程序,我想在程序执行期间访问局部变量的变量名,并在外部传递它们。 我知道Java会在编译期间转储本地变量名,除非在调试模式下编译。 看了一下之后,似乎JDI / JPDA就是这种工作的方式。 假设ref引用了ThreadReference ,以下是我到目前为止的内容: ref.suspend(); StackFrame currentFrame = ref.frame(0); List vars = currentFrame.visibleVariables(); ref.resume(); 两个问题: 我是在正确的轨道上,还是有更好的方法来做到这一点? 如何获取ThreadReference以设置为ref ? LocatableEvent似乎是我需要的,但任何人都可以提供一个如何使用它的例子吗? 提前谢谢了!

Java:方法挂钩和查找对象实例

情况 嗨,我有2个问题。 情况是我正在为Windows编写Java API ,它还提供了将代码注入进程然后操作目标的工具。 我已经实现了注射部件 ,例如将一个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-Code,这是一种非常低级的方法,我想避免这种情况 。 我可以假设此时有一个对象引用,也许Reflection API提供了一种更改对象方​​法的方法? 或者至少简单地提供挂钩机制? 请注意,更改目标代码当然不适合我。 并且它已经在运行时,因此ByteCode-Manipulation也可以是一个选项。 脚本 这会派上用场: […]

使用jdi构建一个简单的调试器来设置断点并检索变量的值

我期待使用java调试接口构建调试器。 我的目标是设置断点并获取变量的值。 我发现这个答案接近我正在寻找的,我明白我必须使用以下接口: – VirtualMachineManager , LaunchingConnector , ClassPrepareEvent , ClassPrepareRequest 。 但我无法弄清楚,如何在特定行设置断点并获取变量的值或接口的使用顺序。 例如,在下面的代码中,我如何继续使用jdi运行它, jdi获得变量S的值 import java.io.*; class Hello { public static void main(String args[]) { String S = “Hello World”; int a = 12; } } 我正在考虑在a = 12或者在main方法结束时设置调试点,以便得到S的值

Ant可以同时启动两个java应用程序吗?

我目前正在开发一个“调试器”java应用程序,它使用JDI连接到已经运行的“目标”java应用程序。 有没有办法让Ant启动我的目标应用程序然后启动我的“调试器”,而第一个应用程序仍在运行? 是的我知道我可以开发JDI应用程序来启动目标程序,但这不是我现在想要的。