我正在使用jdi接口来创建调试器,当我使用MethodEntryRequests启用方法条目跟踪时,调试程序的速度减慢了几十倍.我为主线程设置了过滤器,并将策略暂停到SUSPEND_EVENT_THREAD.Classfilter是有限的,如果我打印任何收到的事件,它不会显示超过几十个,所以它不应该收到太多.我在本地调试并且使用调试的java程序跟随它的命令行:
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=y,server=y,address=1337
我正在运行Eclipse for Java.我创建了一个XML文件的DOM版本.现在我想更改文件中元素的属性.我调用了一个方法,在控制DOM的类中调用了一个方法,并且在调试时我得到了一个对话框,说"JDI线程评估遇到了问题.异常处理异步线程队列".
我是Java的相对新手,并没有遇到过这样的错误,我不知道是什么导致了它.
如果有人对问题的原因和/或解决问题的方法有任何建议......
非常感谢!
我找到了一些专门用于在VirtualMachine中进行调试的com.sun.jdi类,但我不能使用它,因为Sun JDK7中似乎不存在包.
如何使用这个包?
BTW.lib/sa-jdi.jar是不是我想要的
当我尝试在我的设备上进行调试时,我有时会收到错误并且调试器不会在任何断点上停止.此外,应用程序甚至没有正确启动,它只是在应用程序图标和名称顶部的黑色屏幕冻结.
错误是eclipse中的弹出窗口,标题为"'JDI Event Dispatch'遇到问题.在'JDI事件调度'期间发生内部错误." 我有一个确定和详细信息按钮,当我按下后者时,我得到以下详细信息:"在发生内部错误:"JDI事件调度".java.lang.NullPointerException"
我在Eclipse Java EE Helios Service Release 2中工作.任何帮助将不胜感激
在Location类的Java Debugger Interface文档中,有一个段落讨论了该位置的"层".我一直在寻找更多有关如何实现新层(例如,Scala或JRuby)的细节,但我没有找到太多.任何人都可以对这个话题有所了解吗?
我有我的java applet codee,我正在尝试使用eclipse Indigo EE进行调试.我正在尝试使用调试配置和端口在远程调试.当我尝试执行应用程序时,它始终给出错误消息,
在"JDI事件调度"java.lang.NullPointerException期间发生内部错误.
并且控制不会在断点处停止.
请帮忙.
此致,KSAT
我在更新调试器以使用Java 8时遇到一些问题.例如,请考虑以下程序:
public class Lam {
public static void main(String[] args) {
java.util.function.Function<Integer, Integer> square =
x -> {
int result = 0;
for (int i=0;
i<x;
i++)
result++;
return result;
};
System.out.println(square.apply(5));
}
}
Run Code Online (Sandbox Code Playgroud)
正如所料,Java 8将lambda编译为如下所示:
> javap -c -p -v -s -constants Lam
Classfile Lam.class
...
private static java.lang.Integer lambda$main$0(java.lang.Integer);
...
Code:
stack=2, locals=3, args_size=1
0: iconst_0
1: istore_1
...
LineNumberTable:
line 5: 0
line 6: 2
line 7: 4
line 9: 12
line 8: 15
line 10: …Run Code Online (Sandbox Code Playgroud) .NET有一些方便的注释,指示调试器逐步执行某些方法.我想知道是否有一个可以在Java平台上运行的等价物.
例如:
@DebuggerStepThrough
public void foo() {
..
}
Run Code Online (Sandbox Code Playgroud)
会导致调试器在步进时不会停止foo.
PS.我正在实现一个调试器并控制发出的字节码
我正在寻找可能的JDI API来在执行期间的任意点暂停JVM.查看BreakPointRequest createBreakpointRequest方法需要一个特定的位置.是否有任何其他API不需要位置或某种方式来获取可以传递以创建断点的当前位置.
我基本上寻找一种方法来附加和暂停应用程序,然后使用JVMTI代理接收BreakPoint事件的回调以执行进一步处理.谢谢
我有自己的 JDI 调试器,它toString在某些对象上调用该方法:
com.sun.jdi.ObjectReferenceobject object = ...
ThreadReference threadRef = frameProxy.threadProxy().getThreadReference();
Value value = object.invokeMethod(threadRef, toStringMethod,
Collections.EMPTY_LIST, ObjectReference.INVOKE_SINGLE_THREADED);
Run Code Online (Sandbox Code Playgroud)
问题是即使在 toString() 方法中没有设置断点, invokeMethod 也永远不会终止,所以我的调试器挂起。例如,当我在Double对象上调用 this 时会发生这种情况。
如何invokeMethod在一段时间后终止执行?
更新:我尝试实现我自己的Double对象并System.out.println()在方法的开头和结尾放置了一些语句,toString()看起来该方法执行得很好,但由于某种原因调试器没有收到结果。也许这是 JDI 中的一个错误,因为有很多这样的错误,但我不是在为此寻找解决方案,我只是在寻找一种方法来中止执行,invokeMethod()如果它花费太多时间。
更新 2:我尝试了ThierryB 的建议,但我只能frameProxy.threadProxy().stop(object);在经理线程中调用。并且管理器线程被阻塞,invokeMethod()因此它不会执行我的命令。我试过这样的事情:
boolean[] isFinished = new boolean[2];
isFinished[0] = false;
DebuggerManagerThreadImpl managerThread = debugProcess.getManagerThread();
new Thread(() - > {
try {
Thread.sleep(2000);
if (!isFinished[0]) {
System.out.println("Invoked"); …Run Code Online (Sandbox Code Playgroud)