问题标签 [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 投票
2 回答
350 浏览

java - JDI - 继承字段上的 ObjectReference.setValue()

我正在使用 JDI 调试程序。我正在尝试更改某个 ObjectReference 中字段的值。我有 Field 对象,因为我可以通过它找到它

但是,我无法使用修改该字段

因为这仅适用于此类或其直接超类中的字段 - 不包括层次结构中的更高类。

是否可以更改比直接超类更高的类中的字段值?如果是这样,我将不胜感激任何帮助!

谢谢,

院长

编辑:我在调用 ObjectReference.setValue() 的行中收到以下错误:

0 投票
1 回答
267 浏览

java - Java JDI CommandLineLaunch 未加载所需的类

我目前正在学习 Java 的 JDI,我正在尝试启动一个正在运行我想要的程序的虚拟机,并建立与正在运行所需程序的已启动 VM 的连接。

为此,我使用了启动连接器(“com.sun.jdi.CommandLineLaunch”)。

我给启动连接器以下参数:

然后使用 启动连接器VirtualMachine vm = connector.launch(args);。但是,当我打印出使用以下代码片段加载的类列表时:

Main2 类不在列表中。

我猜这是一个类路径问题,但无法让它工作。Main2.class 文件与上述代码所在的类位于同一目录中。

有谁知道是什么问题?

0 投票
1 回答
3525 浏览

eclipse - com.sun.jdi.VMDisconnectedException:从虚拟机得到 IOException

我在试图摆脱这个异常时遇到了麻烦。我编写了一个程序,使用“com.sun.jdi.SocketAttach”作为附加连接器将调试器附加到远程服务器,一旦建立连接,我添加了一个调试目标。

我的代码工作正常,但每次我关闭与服务器有活动调试连接的 Eclipse 工作区时都会出现此异常。看起来像这样:

在调查该问题后,我发现即使在 VM 断开连接后客户端向 VM 发送请求时也会引发此异常。但就我而言,我没有在服务器上部署任何应用程序,也没有调试任何应用程序,在关闭工作区后,我仍然收到此异常。

我试图实现 DebugEventListener 但不确定是否在正确的轨道上。如果您知道如何解决此问题,请告知。

谢谢

0 投票
1 回答
469 浏览

android - android本机调用中的不满意链接错误

我正在尝试从 android 活动类调用本机函数,这会导致不满意的链接错误。这里是活动。

本机.h

本机.c:

目录

08-03 17:58:54.040: D/dalvikvm(4007): 试图加载 lib /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70

08-03 17:58:54.050: D/dalvikvm(4007): 添加共享库 /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70

08-03 17:58:54.050: D/dalvikvm(4007): 在 /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70 中找不到 JNI_OnLoad,跳过初始化

08-03 17:58:55.700:D/gralloc_goldfish(4007):没有检测到 GPU 仿真的仿真器。08-03 17:59:15.040: W/dalvikvm(4007): 找不到本地 Lcom/example/rockboost/MainActivity 的实现;.hello:()V

08-03 17:59:15.050: D/AndroidRuntime(4007): 关闭 VM 08-03 17:59:15.050: W/dalvikvm(4007): threadid=1: 线程退出但未捕获异常 (group=0xb1a4ed70)

08-03 17:59:15.130:E/AndroidRuntime(4007):致命异常:主要

08-03 17:59:15.130:E/AndroidRuntime(4007):进程:com.example.rockboost,PID:4007

08-03 17:59:15.130: E/AndroidRuntime(4007): java.lang.UnsatisfiedLinkError: 找不到本机方法: com.example.rockboost.MainActivity.hello:()V

java:95) 08-03 17:59:15.130: E/AndroidRuntime(4007): 在 android.os.Looper.loop(Looper.java:136) 08-03 17:59:15.130: E/AndroidRuntime(4007) : 在 android.app.ActivityThread.main(ActivityThread.java:5026) 08-03 17:59:15.130: E/AndroidRuntime(4007): 在 java.lang.reflect.Method.invokeNative(Native Method) 08-03 17 :59:15.130: E/AndroidRuntime(4007): at java.lang.reflect.Method.invoke(Method.java:515) 08-03 17:59:15.130: E/AndroidRuntime(4007): at com.android。 internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 08-03 17:59:15.130: E/AndroidRuntime(4007): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602 ) 08-03 17:59:15.130: E/AndroidRuntime(4007): at dalvik.system.NativeStart.main(Native Method) 08-03 18:04:16.680: I/Process(4007): 发送信号。PID: 4007 SIG: 9 08-03 18:24:16.030: D/dalvikvm(5266):

08-03 17:58:54.040: D/dalvikvm(4007): 试图加载 lib /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70 08-03 17:58:54.050: D/ dalvikvm(4007):添加共享库 /data/app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70 08-03 17:58:54.050:D/dalvikvm(4007):在 /data/ 中找不到 JNI_OnLoad app-lib/com.example.rockboost-1/libhellomodule.so 0xb1c88e70,跳过初始化 08-03 17:59:15.040: W/dalvikvm(4007): 未找到本机 Lcom/example/rockboost/MainActivity;.hello 的实现:()V

库编译。我可以在日志中看到可以加载共享库。但是本机调用不起作用并导致不满意的链接错误

据我所知,命名约定似乎很好。我可以启动应用程序,该错误仅在调用本机函数时发生。我还确保该库是为正确的 cpu/架构而构建的,

更新

我运行 objdump -t 来检查符号表:

所以该函数不在库中,但我不知道为什么。这是我的 Android.mk 文件:

这可能有问题,但我不确定在哪里。

更新 2

修复了我的 Android.mk 并使用了另一个库

编译正常,但结果相同,程序在库中找不到函数。粗略的 nm 表明该符号在那里:

0 投票
2 回答
300 浏览

java - 生活在远程 JVM 中的对象的 JDI 镜像的生命周期

我一直在编写一个 Java 客户端,它使用JDI在远程 JVM 中创建和修改对象(通过连接到在远程 JVM 中运行的基于JDWP代理的服务器)。我的项目的要求之一是我不能暂停远程 JVM 中的所有线程,这意味着我创建的对象在我可以在 JVM 中访问它们之前可能会受到垃圾收集的影响。

在某些情况下,我在远程 JVM 中创建对象,但它们是随机被垃圾收集的。例如,如果我通过 在远程 JVM 中创建一个数组ArrayType.newInstance(int),有时该数组将被垃圾收集,然后我才能使其从远程 JVM 中的另一个可访问对象“可访问”。

例如,如果我试图将新数组存储到现有可访问对象的字段中,则调用ObjectReference.setValue(Field, Value)可能会随机抛出一个. ObjectCollectedException):

从理论上讲,aObjectReference的镜像甚至可以在我能够调用之前被垃圾收集ObjectReference.disableCollection()(无论如何,由于其他原因,我不想采取这个步骤)。

所以我的问题是,JDI 上是否有任何记录在案Value的寿命保证?

  • 远程 JVM 中原始值的镜像是否免于 GC?(有人认为会是,但方法文档中没有任何说明。)VirtualMachine. mirror*()
  • 字符串的镜像是否免于 GC?(有人会认为不是,但 JavaDoc 似乎保持沉默。)
  • 我假设任何其他人ObjectReference都可以随时进行 GC,除非您之前设法在其上禁用 GC?

在此先感谢您的帮助!

0 投票
2 回答
1434 浏览

java - JDI VMDisconnectedException

我正在使用 JDI 为 Java 应用程序编写调试器。

我使用以下方法运行调试进程:

这是一个非常简单的程序。它所做的只是实例化一个 Test 对象并在 for 循环中将 foo 字段设置为 0..10。

现在我从这个网站下车的调试器程序: 链接

通常,我会监听更多事件,例如命中断点等,但即使是正常的程序执行也至少应该打印我:

但是,当我尝试打印事件时,会随机抛出异常 VMDisconnectedException。然后我会得到:

我的 VMStartEvent (或任何其他,如果我听更多的事件)现在包含一个异常。当我在 catch 子句中放置断点时,我得到:

在这个异常之后,我仍然从集合中得到一个 VMDeathEvent。现在,我不知道为什么会随机发生,也不知道为什么会发生,因为我的被调试进程以挂起的方式启动,并且只有在我将自己附加为调试器后才恢复它。

0 投票
0 回答
118 浏览

java - 如何检测jdi调用调用?

我有一个断点,它附加了一些逻辑,如果它所在的方法是从 JDI 调用的,我想跳过这些逻辑。

即在客户端jvm中

应该导致与断点关联的代码运行但

在调试器 jvm 中应该会导致逻辑被跳过并恢复代码。

我有两个问题:

jdi 方法调用如何出现在客户端 JVM 的 java 调用堆栈上?

如果无法使用调用堆栈检测调用,是否可以使用另一种方法?

0 投票
1 回答
334 浏览

java - 使用 Java 调试接口手动加载类

背景

我正在创建一个将 Java 代码转换为 UML 类图的工具。由于我只有 3 周的时间来完成这项任务,我的老师建议我使用 Java 调试接口而不是创建解析器来完成这项任务。

问题

我已经注册了 ClassPrepareEvents,它显示了 VM 何时加载类(参见下面的代码片段),但是类仅在需要时加载。例如,如果在 GUI 中单击一个按钮会创建一个类型为 A 的对象,那么在用户单击该按钮之前不会加载 A。

这需要一个自动化工具,因此需要在没有用户交互的情况下加载程序中的所有类,那么如何手动加载所有这些类呢?还是我错过了 API 中的某些内容,并且还有另一种方法可以做到这一点?

提前致谢!:)

代码片段

0 投票
1 回答
99 浏览

java - 使用JDI时如何访问语句对象(每行代码)?

我正在编写一个程序来使用 JDI 逐步执行 Java 代码。我现在可以检查任何给定时刻我关心的所有变量的值。

现在,我希望能够检查每一行代码的性质(正在逐步执行)。例如,程序是否在两个变量之间进行比较?是赋值语句吗?

我浏览了各种课程和教程,但无法找到是否有课程介绍了这个概念。我发现的最接近的东西是Location类......但它仍然不包含我所追求的信息。

0 投票
1 回答
112 浏览

java - 使用 JDI 从哈希表中丢失元素

我已经声明并初始化了这些哈希表:

我想使用 JDI 从哈希表中提取值来比较元素对,我有一个方法,其参数为 ArrayReference s0、s1 ArrayReference、Parameter parameter1、parameter2 参数:

问题是在提取值期间我丢失了一个元素。该元素不在内存中。Java版本:1.8.0_40

输出:http: //i.imgur.com/BrqctVj.gif

有谁知道如何解决?