我正在尝试远程调试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)
答案 0 :(得分:8)
如果从未捕获到异常,则会导致应用程序关闭并终止JVM,这显然会结束调试会话。
您可以添加异常断点,以便调试器在抛出异常后立即暂停执行。单击调试工具栏中的“查看断点”按钮,然后查看“异常断点”选项卡。它有助于了解您正在寻找的异常类型,以便您可以为该特定类型设置异常断点;您应该能够通过检查堆栈跟踪找到合适的类型。否则,您将最终暂停许多不相关的例外。如果您知道发生异常的线程,那么将异常断点限制到该线程也是有帮助的。
请注意,SBT(如果您不分支单独的VM)和Scala的运行程序(如果 分叉)都会捕获客户端代码中抛出的所有异常。因此,不存在“未捕获的例外”,您将需要暂停“捕获的例外”。
答案 1 :(得分:1)
在开始之前我没有对任何scala进行编码,但这可能有助于您在java中捕获未捕获的异常,请参阅方法Thread.UncaughtExceptionHandler
线程即将终止时 由于Java未被捕获的异常 虚拟机将查询该线程 因为它的UncaughtExceptionHandler使用 Thread.getUncaughtExceptionHandler() 并将调用处理程序 uncaughtException方法,传递 线程和异常作为参数。 如果一个线程没有它的 UncaughtExceptionHandler显式 set,然后它的ThreadGroup对象动作 作为UncaughtExceptionHandler。如果 ThreadGroup对象没有特殊之处 处理的要求 例外,它可以转发 调用默认的未捕获 异常处理程序。
我猜您可以记录异常,它可以让您深入了解问题。
编辑:这也假设您可以重新部署新项目,但可能并非如此。