java - JVM 远程调试 session 因未捕获的异常而终止

标签 java debugging scala jvm intellij-idea

我正在尝试远程调试 Scala 项目。执行程序(从 SBT 构建和执行)和我的调试器 (Intellij) 都是本地的,但由于我不想使用 Intellij 构建,使用远程调试 session 似乎是方便调试的最简单选择。

程序以下列选项启动:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005

它在启动时成功挂起,我可以成功附加我的调试器。我可以设置断点并逐步执行代码,但问题是未捕获的异常终止了调试 session 并断开了调试器,从而破坏了调试的目的。这是默认行为是愚蠢的,所以我一定是做错了什么。

Intellij 的控制台显示:

Connected to the target VM, address: 'localhost:5005', transport: 'socket'
Disconnected from the target VM, address: 'localhost:5005', transport: 'socket'

我在执行或调试方面是否遗漏了什么?

编辑:在我的类主体中抛出 new Exception("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 终止,这显然会结束调试 session 。

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

请注意,SBT(如果您没有 fork 一个单独的 VM)和 Scala 的运行程序(如果您正在 fork )都会捕获客户端代码中抛出的所有异常。因此,不会有“未捕获的异常”,你需要在“捕获的异常”上暂停。

关于java - JVM 远程调试 session 因未捕获的异常而终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6027788/

相关文章:

java - 我怎样才能在更新托管 bean 对象的 xpages 对话框中有一个动态数据表?

java - 如何从 FileChooser JavaFX 获取路径对象

visual-studio-2008 - 调试命令(step over/into)导致未处理的异常

debugging - 如何在 Visual Studio Code 中调试 C++ 代码

scala - 在 Scala 中,将顶级特征声明为私有(private)或包私有(private)有什么区别?

java - 比较两个可调整大小的数组集

java - AbsListView$RecycleBin.addScrapView() 问题中的 SectionedAdapter ArrayIndexOutOfBoundsException?

ios - 如何在 Swift 中调试内存警告?

scala - Spark : calling a function inside of mapPartitionsWithIndex

scala - scala 如何支持这种 sbt DSL 语法?