如何确定退出后我的Java应用程序继续运行的原因?

时间:2018-05-19 08:24:44

标签: java winapi launch4j

我正在为Windows开发Java桌面应用程序,我正在尝试实现Windows Restart Manager。我已成功接收退出应用程序的Windows消息,当我手动发送它时,它只是工作,应用程序关闭。

当我在卸载过程中执行此操作时,我的应用程序中的关闭过程会运行,我甚至可以看到它调用System.exit(0),但即使在此之后,也有一个不会停止的过程。我的Java应用程序使用launch4j打包成可执行文件,以防相关。

我知道调用System.exit(0)的方式是因为我将调试信息转储到文件中并打印出System.exit(0)即将被调用,我可以看到应用程序是否成功或未能正常关闭。

使用Process Explorer我可以看到javaw.exe子进程,当退出过程发生时,它会消失,但父进程仍然存在。当它正在运行时,它看起来像这样:

enter image description here

退出失败后,它看起来像这样:

enter image description here

如果我有一个远程调试器连接到进程,此时调试器将断开连接。

导致这种情况的原因是什么?

我接近确信这是launch4j中的一个错误,所以,我在此处报告:https://sourceforge.net/p/launch4j/bugs/185/

1 个答案:

答案 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确实终止了;所以没有挂钩。