Java验尸调试?

时间:2008-11-24 17:26:43

标签: java debugging exception

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

3 个答案:

答案 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的友好范围内调试问题。可以重放的问题包括配置问题,数据库异常和线程问题。看看:

http://www.replaysolutions.com