首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDI VMDisconnectedException

JDI VMDisconnectedException
EN

Stack Overflow用户
提问于 2014-10-28 21:36:49
回答 2查看 1.3K关注 0票数 0

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

我使用以下命令运行debugee进程:

代码语言:javascript
复制
'/usr/lib/jvm/jdk-8-oracle-x64/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y -cp (...) program.entrypoint.Test'

这是一个非常简单的程序。

现在我从这个站点得到的调试器程序是:link

代码语言:javascript
复制
public class FieldMonitor {

    public static void main(String[] args) throws IOException, InterruptedException {
        // connect
        VirtualMachine vm = new VMProvider().connect(8000);

        vm.resume();

        EventQueue eventQueue = vm.eventQueue();
        while (true) {
            EventSet eventSet = eventQueue.remove();
            for (Event event : eventSet) {
                try {
                    System.out.println(event);

                    if (event instanceof VMDeathEvent || event instanceof VMDisconnectEvent) {
                        return;
                    }
                    else if(...)
                }
                catch(VMDisconnectedException e) {
                    e.printStackTrace();
                }
            }
            eventSet.resume();
        }
    }
}

代码语言:javascript
复制
VMStartEvent in thread main
VMDeathEvent

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

代码语言:javascript
复制
com.sun.jdi.VMDisconnectedException
    at com.sun.tools.jdi.TargetVM.waitForReply(TargetVM.java:304)
    at com.sun.tools.jdi.VirtualMachineImpl.waitForTargetReply(VirtualMachineImpl.java:1036)
    at com.sun.tools.jdi.PacketStream.waitForReply(PacketStream.java:69)
    at com.sun.tools.jdi.JDWP$ThreadReference$Name.waitForReply(JDWP.java:4931)
    at com.sun.tools.jdi.JDWP$ThreadReference$Name.process(JDWP.java:4912)
    at com.sun.tools.jdi.ThreadReferenceImpl.name(ThreadReferenceImpl.java:168)
    at com.sun.tools.jdi.EventSetImpl$ThreadedEventImpl.toString(EventSetImpl.java:184)
    at java.lang.String.valueOf(String.java:2981)
    at java.io.PrintStream.println(PrintStream.java:821)
    at virtualmachine.FieldMonitor.main(FieldMonitor.java:33)
VMDeathEvent

我的VMStartEvent (如果我监听更多的事件,也可以是其他的)现在包含了一个异常。当我把一个断点放在catch-子句中时,我得到:

代码语言:javascript
复制
com.sun.jdi.VMDisconnectedException: connection is closed

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

EN

回答 2

Stack Overflow用户

发布于 2015-07-22 17:34:24

首先,您需要更多关于事件处理的详细信息。下面是我的类似程序的输出:

代码语言:javascript
复制
VMStartEvent in thread main
VMDeathEvent
VMDisconnectEvent

但是,我没有这样的声明:

代码语言:javascript
复制
vm.resume();

如果我包含它,我会得到相同的异常。

代码语言:javascript
复制
Exception in thread "main" com.sun.jdi.VMDisconnectedException: connection is closed
    at com.sun.tools.jdi.TargetVM.send(TargetVM.java:274)
    at com.sun.tools.jdi.VirtualMachineImpl.sendToTarget(VirtualMachineImpl.java:1011)
    at com.sun.tools.jdi.PacketStream.send(PacketStream.java:41)
    at com.sun.tools.jdi.JDWP$ThreadReference$Name.enqueueCommand(JDWP.java:4928)
    at com.sun.tools.jdi.JDWP$ThreadReference$Name.process(JDWP.java:4914)
    at com.sun.tools.jdi.ThreadReferenceImpl.name(ThreadReferenceImpl.java:77)
    at com.sun.tools.jdi.EventSetImpl$ThreadedEventImpl.toString(EventSetImpl.java:168)
    at java.lang.String.valueOf(String.java:2826)
    at java.io.PrintStream.println(PrintStream.java:771)

所以,我猜这与引起问题的vm.resume()函数调用有关。霍普,这有帮助。

票数 0
EN

Stack Overflow用户

发布于 2021-01-20 16:31:56

异常是由System.out.println(event)内部发生的event.toString抛出的。如果事件是ThreadedEventImpl的实例,则会发生这种情况

代码语言:javascript
复制
public String toString() {
    return eventName() + " in thread " + thread.name();
}

因为thread.name()向VM发送命令并等待应答,但是VM可能已经断开连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26609795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档