Java验尸调试?

Geo*_*Geo 8 java debugging exception

是否可以在Java中进行事后(或异常后)调试会话?解决方法是什么(如果还没有解决方案)?

Mar*_*gón 4

您可以将调试器附加到 java 进程,并在收到特定异常时设置断点。这是你需要的吗?

来自 http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/jdb.html

当发生异常且 Java 程序堆栈上的任何位置都没有 catch 语句时,Java 运行时通常会转储异常跟踪并退出。然而,当在 jdb 下运行时,该异常被视为不可恢复的断点,并且 jdb 在有问题的指令处停止。如果该类是使用 -g 选项编译的,则可以打印实例和局部变量来确定异常的原因。

可以使用任何 IDE(例如 Eclipse)设置此类断点。使用 eclipse,您还可以在特定异常类型上设置断点,即使它是在正常代码中捕获的。

如果您正在运行多线程服务器之类的东西,并且为客户端提供服务的线程之一抛出未处理的异常,那么您将能够检查调试器并看看会发生什么。我认为这不适合生产,但在测试时绝对有帮助。

应用程序不必从调试器运行,但可以使用调试选项作为参数来启动它:

-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=XXXX
Run Code Online (Sandbox Code Playgroud)

应用程序正常运行,但在遇到断点时会切换到“解释”模式,至少在更现代的 JVM 版本中是这样。所以性能不受影响。

查看有关HotSpot VM 全速调试的部分

全速调试

Java HotSpot VM 现在使用全速调试。在以前版本的VM中,当启用调试时,程序仅使用解释器执行。现在,程序可以充分利用 HotSpot 技术的性能优势,即使是编译后的代码也是如此。改进的性能使长时间运行的程序更容易调试。它还允许测试全速进行。一旦出现异常,调试器就会启动,并且可以完全查看代码源。