Java JVM远程调试会话在未捕获异常时终止

Java JVM远程调试会话在未捕获异常时终止,java,debugging,scala,jvm,intellij-idea,Java,Debugging,Scala,Jvm,Intellij Idea,我正在尝试远程调试scala项目。执行程序(从SBT生成和执行)和我的调试器(Intellij)都是本地的,但由于我不想使用Intellij生成,因此使用远程调试会话似乎是方便调试的最简单选项 程序通过以下选项启动: -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 它在启动时已成功挂起,我可以成功连接我的调试器。我可以设置断点并逐步完成代码,但问题是,未捕获的异常会终止调试会话并断开调试器的连接,从而破

我正在尝试远程调试scala项目。执行程序(从SBT生成和执行)和我的调试器(Intellij)都是本地的,但由于我不想使用Intellij生成,因此使用远程调试会话似乎是方便调试的最简单选项

程序通过以下选项启动:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
它在启动时已成功挂起,我可以成功连接我的调试器。我可以设置断点并逐步完成代码,但问题是,未捕获的异常会终止调试会话并断开调试器的连接,从而破坏了调试的目的。这是默认行为,因此我必须做错事

Intellij的控制台显示:

Connected to the target VM, address: 'localhost:5005', transport: 'socket'
Disconnected from the target VM, address: 'localhost:5005', transport: 'socket'
在执行或调试方面,我是否缺少一些东西

编辑:添加一个堆栈跟踪,我将在类的主目录中抛出新异常(“what”):

[error] java.lang.Exception: what
[error]     at travellr.application.prophet.Prophet$.main(Prophet.scala:80)
[error]     at travellr.application.prophet.Prophet.main(Prophet.scala)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[error]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[error]     at java.lang.reflect.Method.invoke(Method.java:597)
[error]     at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:81)
[error]     at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24)
[error]     at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:86)
[error]     at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:81)
[error]     at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:86)
[error]     at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:83)
[error]     at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

如果从未捕获到异常,它将导致应用程序关闭,JVM终止,这显然会结束调试会话

您可以添加一个异常断点,以便调试器在抛出异常时立即暂停执行。单击调试工具栏中的“查看断点”按钮,然后查看“异常断点”选项卡。它有助于了解您要查找的异常类型,以便您可以为该特定类型设置异常断点;您应该能够通过检查stacktrace找到合适的类型。否则,您将挂起许多不相关的异常。如果您知道异常发生在哪个线程上,那么将异常断点限制在该线程上也会有所帮助


请注意,SBT(如果您没有分叉一个单独的VM)和Scala的runner(如果您分叉)都捕获客户端代码中抛出的所有异常。因此,将不会有“未捕获的异常”,您需要暂停“捕获的异常”。

在开始之前,我没有编写任何scala,但这可能有助于您在java中捕获未捕获的异常。请参见方法

当线程即将终止时 由于一个未捕获的异常,Java 虚拟机将查询线程 对于其未捕获的ExceptionHandler,使用 Thread.getUncaughtExceptionHandler()线程 并将调用处理程序的 uncaughtException方法,传递 线程和异常作为参数。 如果一个线程没有 UncaughtExceptionHandler显式 设置,则其ThreadGroup对象将起作用 作为其未捕获的异常处理程序。如果 ThreadGroup对象没有特殊的 处理 例外情况下,它可以转发 调用默认未捕获 异常处理程序

我想您可以记录异常,它可能会让您了解问题


编辑:这还假设您可以重新部署一个新项目,但情况可能并非如此。

供将来参考:由于这不是特定于scala的,您可能会通过添加“java”标记得到更快的响应。我意识到,我之所以包括scala,是因为这是一个非常直接的问题,我想可能是Scala/SBT的某些方面把我搞砸了。我只是勾选了“任何异常”、“通知”->“未捕获异常”和“暂停策略”->“全部”,但它仍然在终止。我已经包括了我的断点窗口的屏幕截图,问题是SBT正在捕获您的异常,所以它不是一个“未捕获的异常”。由于默认情况下SBT在同一个VM中运行您的程序,因此它会捕获任何未捕获的异常,以防止它们终止SBT进程。勾选“捕获异常”框,你应该很乐意去做。我讨厌成为一个有着过分具体问题的令人讨厌的家伙,但我在分岔(执行过程中没有SBT的痕迹)。轨迹跟踪的底层是scala.tools.nsc.MainGenericRunner.main()。我已将堆栈跟踪添加到问题中。是否尝试挂起“捕获的异常”?在我看来,捕获的异常也能捕获异常。捕获的异常在技术上是有效的,但这就像大海捞针,而我还不知道针(用于测试)。MainGenericRunner似乎只从2.8.1源代码中捕获了“ClassNotFound/NoSuchMethodException/InvocationTargetException”(我已经查看了整个堆栈跟踪,找不到任何会吞噬异常的内容)->