是否可以在Java中进行事后(或异常后)调试会话?解决方法是什么(如果还没有解决方案)?
答案 0 :(得分:4)
您可以将调试器附加到java进程并在特定时设置断点 收到例外。这是你需要的吗?
从 http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/jdb.html
发生异常时 任何地方都没有捕获声明 Java程序的堆栈,Java 运行时通常会转储异常 追踪和退出。在奔跑下 但是,jdb是异常 被视为不可恢复的 断点,jdb停在 违规指令。如果那个班 是用-g选项编译的, 实例和局部变量都可以 印刷,以确定原因 异常。
可以使用任何IDE(例如Eclipse)设置此类断点。使用eclipse,您还可以在特定的异常类型上设置断点,即使它是在普通代码中捕获的。
如果您运行多线程服务器,并且其中一个服务于客户端的线程抛出未处理的异常,那么您将能够检查调试器并查看会发生什么。我不认为这是生产的东西,但在测试时确实有帮助。
应用程序不必从调试器运行,但可以使用调试选项作为参数启动:
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=XXXX
应用程序正常运行,但在命中断点时切换到“解释”模式,至少在更现代版本的JVM中。因此性能不受影响。
查看有关full-speed debugging for HotSpot VM
的部分全速调试
Java HotSpot VM现在使用 全速调试。在以前 调试时的VM版本 启用后,程序执行使用 只有翻译。现在,完整 HotSpot的性能优势 技术可用于程序, 即使是已编译的代码。改进了 性能允许长时间运行 程序更容易调试。 它还允许进行测试 全速。一旦有了 异常,调试器启动时 完全了解代码源。
答案 1 :(得分:4)
据我所知,您必须等待Java 7才能获得官方API - 请参阅http://tech.puredanger.com/java7#jsr326。
与此同时,您可以替换Exception(替换基类,通过检测注入代码等)来保存您的数据。请注意,虽然ClassLoader会定期抛出并捕获ClassNotFoundException(每个新包加载)。你可以通过这种方式进行大量控制,而无需修改基本代码。
答案 2 :(得分:4)
我是Replay Solutions的解决方案架构师。它们为java应用程序提供了“时间机器”。您可以在应用程序运行时记录它(比如在QA环境中),然后重放开发计算机上的记录。您不需要访问数据库,配置等。您只需要他们的ReplayDIRECTOR解决方案,您就可以在IDE的友好范围内调试问题。可以重放的问题包括配置问题,数据库异常和线程问题。看看: