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

java - 如何从 JVMTI 中的 Step Event 中排除非项目类?

目前这是我生成 Step 事件的方式:

然后是回调本身:

但这会为 JVM 内执行的每条指令生成一个事件,即使我有一个带有 3 行代码(并且没有库)的简单控制台应用程序,它也会触发 100 万个步骤事件。如何仅将步骤事件添加到我自己的代码中?

0 投票
0 回答
145 浏览

java - com.sun.jdi.InternalException:得到错误代码回复:502 发生调用方法

我正在尝试调试远程服务并在 eclipse 调试器中不断收到此错误。我最初认为这是一个网络问题,并在远程 VM 上设置了调试环境,但问题仍然存在。请帮我解决它。

0 投票
0 回答
85 浏览

java - JVMTI 的断点事件在哪里调用?

我克隆了 OpenJDK8 的源代码并想检查 JVMTIBreakpoint回调的确切调用位置。我发现所有断点都存储在类型列表中JvmtiBreakpoint。我找不到的是触发断点事件的确切位置。

编辑:我找到了这个方法,但不确定这是否会触发事件:

由以下人员调用:

这将我带到bytecodeInterpreter.cpp调用此方法的文件。在这个文件中,我们有:

但是我仍然不明白当我在代码中放置断点时会发生什么?JVM 是否在该位置检测字节码并放置断点操作码?

Edit2:我发现在设置断点时,最终

叫做。

0 投票
1 回答
46 浏览

java - Hotspot JVM 的 JITed 代码中可以设置断点吗?

我读过这在(现已退役的)Harmony JVM中是可能的,但是 Hotspot JVM 呢?这可能吗?如果没有,断点是否会阻止代码被 JITed,这意味着断点的成本更高?

0 投票
1 回答
247 浏览

java - 如何使用检测在 Java 代码中设置断点?

因此,根据 Java 规范,操作码202 (1100 1010)为断点事件保留的。我尝试在 ASM 库的帮助下在 Java 方法中插入断点操作码:

但是 JVM 崩溃并显示错误消息:no original bytecode found in ... at bci 0. 在 Hotspot 实现中搜索后,我发现了引发此错误的位置:

因此,根据这一点,该方法需要知道断点(它将所有断点存储在一个列表中),但如果它是通过代码检测直接设置的,则它不知道它。

是否有解决方法(没有 JVMTI)来使用代码检测设置断点事件?

0 投票
1 回答
208 浏览

java - 是否有可能在被调试者端用 Java 获取 JDI 当前的 StackFrame?

因此,JDI允许我们在调试对象应用程序中设置断点,然后StackFrame通过JDWP. 据我了解,JVMTI在被调试者端用于将请求的信息发送到JDIthrough JDWP

是否可以从调试器本身获取电流StackFrame(因此无需将其发送到调试器......调试器将是它自己的调试器)?

例如考虑以下代码:

0 投票
0 回答
37 浏览

java - 如何处理使用 Java JDI 调试的 Java 控制台应用程序的输入?

我正在为一个 uni 项目使用 JDI 编写我自己的调试器。使用此调试器,我想记录已执行的代码行和目标程序的属性。稍后我想可视化日志文件。

我得到了调试器,它记录了行和属性的值,但是当我调试 Java 控制台应用程序并且控制台应用程序需要 cmd 中的输入时,它会卡住,因为我无法给出一个输入。

现在一些代码:

这是我的调试器卡住的部分

当调试器到达 reader.readline() 部分时,它会卡住,因为被调试的程序正在等待输入,但我无法将输入转发给它,因为我的 cmd 正在运行调试器程序并且调试器没有处理输入。

这是我的调试器的主要方法:

我想到了两种可能的解决方案:

  • 在它自己的 cmd 窗口中打开目标调试对象。
  • 不知何故让调试器转发并接收被调试者的输入和输出

我试着让它与 vm 一起工作。处理.getInputStream() 和 .getOutputStream(),但无法使其正常工作,因为我不知道在调试器中处理 getOutputStream 的位置。

提前感谢您提供有关如何执行此操作的任何答案和提示!如果您对我的问题有任何疑问,我很乐意回答。

0 投票
1 回答
167 浏览

java - 如何从 Java 的 JDI 中隐藏变量?

我正在检测一些类并引入一些新的局部变量。现在,当用户在代码中放置断点并停止执行时,可以在 Intellij IDEA 的调试器窗口中看到新引入的局部变量。我该如何隐藏它们?

更新:我将不得不以某种方式从检测代码中删除调试信息,但不知道该怎么做。

更新 2:我正在使用 ASM 库进行检测。

__my__data__显示在 Intellij IDEA 中。

0 投票
1 回答
276 浏览

java - 如何在 com.sun.jdi.ObjectReference 上中止长时间运行的 invokeMethod?

我有自己的 JDI 调试器,它toString在某些对象上调用该方法:

问题是即使在 toString() 方法中没有设置断点,invokeMethod 也永远不会终止,所以我的调试器会挂起。例如,当我在一个Double对象上调用它时会发生这种情况。

我怎样才能invokeMethod在一段时间后终止执行?

更新:我尝试实现自己的Double对象并在方法System.out.println()的开头和结尾放置一些语句,toString()似乎该方法执行得很好,但由于某种原因调试器没有收到结果。也许这是JDI中的一个错误,因为有很多这样的错误,但我不是在寻找解决方案,我只是在寻找一种方法来中止执行,invokeMethod()如果它需要太多时间。

Update2:我尝试了ThierryB的建议,但我只能frameProxy.threadProxy().stop(object);在管理器线程中调用。并且管理器线程被阻塞,因为invokeMethod()它不会执行我的命令。我试过这样的事情:

frameProxy.threadProxy().stop(object);永远不会执行,因为DebuggerCommand's action没有调用该方法(线程被阻塞)。

当我的调试器挂起并且我强制停止进程时,这也是一个堆栈跟踪:

更新 3:使用哪个线程来调用方法?目前我正在使用frameProxy.threadProxy().getThreadReference();它在大多数情况下都可以正常工作,但是最好创建一个单独的线程来调用对象上的方法(沿着我的 JDI 调试器,我在应用程序中还有一个检测代理,所以我可以创建一个单独的线程只是为了这个用例(也许这会防止死锁?))。

更新 4:目前我正在使用SUSPEND_ALL作为暂停策略,使用它会更好SUSPEND_EVENT_THREAD吗?

0 投票
0 回答
60 浏览

java - 在 com.sun.jdi.ObjectReference 上调用方法时,何时使用 INVOKE_SINGLE_THREADED 或 INVOKE_NONVIRTUAL?

com.sun.jdi.ObjectReference实例上调用方法时,您必须提供一些options:要么INVOKE_SINGLE_THREADED,要么INVOKE_NONVIRTUAL

根据Javadoc:

INVOKE_SINGLE_THREADED:仅在调用线程恢复的情况下执行方法调用
INVOKE_NONVIRTUAL:执行非虚拟方法调用

但我仍然对这些选项的含义感到困惑。