JVM远程调试会话终止于未捕获的异常

时间:2011-05-17 07:47:05

标签: java debugging scala jvm intellij-idea

我正在尝试远程调试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)

2 个答案:

答案 0 :(得分:8)

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

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

请注意,SBT(如果您不分支单独的VM)和Scala的运行程序(如果 分叉)都会捕获客户端代码中抛出的所有异常。因此,不存在“未捕获的例外”,您将需要暂停“捕获的例外”。

答案 1 :(得分:1)

在开始之前我没有对任何scala进行编码,但这可能有助于您在java中捕获未捕获的异常,请参阅方法Thread.UncaughtExceptionHandler

  

线程即将终止时   由于Java未被捕获的异常   虚拟机将查询该线程   因为它的UncaughtExceptionHandler使用   Thread.getUncaughtExceptionHandler()   并将调用处理程序   uncaughtException方法,传递   线程和异常作为参数。   如果一个线程没有它的   UncaughtExceptionHandler显式   set,然后它的ThreadGroup对象动作   作为UncaughtExceptionHandler。如果   ThreadGroup对象没有特殊之处   处理的要求   例外,它可以转发   调用默认的未捕获   异常处理程序。

我猜您可以记录异常,它可以让您深入了解问题。

编辑:这也假设您可以重新部署新项目,但可能并非如此。