1

我想我在 jvm 或 gnome 3 上发现了一个错误。如果应用程序在关闭或注销时激活了 EDT,则永远不会在 gnome 3 上运行 Shutdownhooks - 永远不会 - 而如果应用程序从未使用过 Swing,它们总是运行/启动/AWT。

如果您忽略此类上注释的“解决方法”方法: https ://gist.github.com/i30817/9421646

(由于某种原因,它实际上可以通过使 gnome-shell 崩溃来更难地关闭关机,尽管我认为我在正确的解决方法中)

并像这样运行测试: java -jar test.jar > test.log

然后尝试注销,重新登录,测试日志为空。

事实上,如果你尝试使用这个 systemtap 脚本运行它(安装 systemtap,像这样运行它: sudo stap -o test.log -c "java -jar test.jar" scriptfile.stp )

probe nd_syscall.exit {
  if(pid() == target()){
   sig = status & 0x7F
   code = sig ? sig : status >> 8
   log(sprintf("EXIT: %4d %s thread: %s %d\n",
      pid(), execname(),
      sig ? "signal" : "exit code", code))
 }
}

您会发现 jvm 退出值绝对不是 0(unix 和系统退出使用的“成功”约定),而如果您在正常操作时退出,它们会是。如果您进一步尝试使用 byteman 脚本,您会看到关闭挂钩甚至永远不会启动。

这是为了确保我不会发疯,这是一个真正的错误,因为我一直在得到这个,我很奇怪java已经被破坏了一年多,没有人注意到。如果你有勇气,你甚至可以取消注释“解决方法”,尽管正如我所说,这种方法让我即使在注销时也会挂起。关闭挂钩确实从它开始。

4

0 回答 0