我正在为Windows开发Java桌面应用程序,我正在尝试实现Windows Restart Manager。我已成功接收退出应用程序的Windows消息,当我手动发送它时,它只是工作,应用程序关闭。
当我在卸载过程中执行此操作时,我的应用程序中的关闭过程会运行,我甚至可以看到它调用System.exit(0)
,但即使在此之后,也有一个不会停止的过程。我的Java应用程序使用launch4j打包成可执行文件,以防相关。
我知道调用System.exit(0)
的方式是因为我将调试信息转储到文件中并打印出System.exit(0)
即将被调用,我可以看到应用程序是否成功或未能正常关闭。
使用Process Explorer我可以看到javaw.exe
子进程,当退出过程发生时,它会消失,但父进程仍然存在。当它正在运行时,它看起来像这样:
退出失败后,它看起来像这样:
如果我有一个远程调试器连接到进程,此时调试器将断开连接。
导致这种情况的原因是什么?
我接近确信这是launch4j中的一个错误,所以,我在此处报告:https://sourceforge.net/p/launch4j/bugs/185/
答案 0 :(得分:0)
也许你还有未完成的ShutdownHook-s尚未完成?
您可以调试对java.lang.ApplicationShutdownHooks.runHooks()
的(java)调用,这样您也可以找到包装器添加了哪些挂钩。
为了调试包装的应用程序,您需要通过添加
来编辑launch4j.xml
文件
<jre>
...
<opt>-Xdebug</opt>
<opt>-Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=y</opt>
</jre>
然后构建另一个版本的exe文件并运行它。嵌入式JVM将使用调试设置运行 - 因此它将等待远程调试器。
修改强> 从上一个截图中我们看到JVM确实终止了;所以没有挂钩。