转储执行 - java?

时间:2011-06-07 18:37:17

标签: java debugging

是否可以在java中转储完整的程序执行?我必须通过一个完整的流程来执行特定的输入值。使用step over,step into有点耗时,我想知道是否有任何java命令转储执行?

2 个答案:

答案 0 :(得分:5)

  1. 也许您想查看 Chronon Time Travel Debugger

    我还没有尝试过,经过长时间的试用期后,似乎现在正式上市,可以满足您的需求。它是商业产品,但提供免费试用。

  2. 另一种替代方法可能是使用随JDK提供的 jsadebugd 实用程序对核心文件进行调试。 (你不能前进和后退,但你可以检查所有可能对你有帮助的线程的堆栈/监视器)

  3. 如果您只需要方法调用,如评论中所述,也许使用jprofiler或yourkit等工具的 profiler 也会有所帮助。

  4. 或者您想要查看 btrace ,一种类似dtrace的工具。

  5. 如果您能够修改/构建应用程序,那么某种小型 AOP方法拦截器也可以完成这项任务。

答案 1 :(得分:1)

如果我理解正确,您需要类似于程序处理某些输入时发生的所有方法调用的视图。您通常可以从分析器中获取此类信息,例如JProbe:

http://www.quest.com/jprobe/

您可以在JProbe下运行该程序,然后它将显示所有方法调用的可视调用图或所有方法调用的列表及其执行频率。

有些相关的是静态分析工具,例如:理解:

http://www.scitools.com/

静态分析工具倾向于关注整体代码结构,而不是通过特定的输入集合发生的事情。

当然,您可以随时更改代码,但更改大型系统中的每个方法以打印调试字符串可能需要做太多工作。面向方面的编程往往是解决此类问题的好方法,因为它是整个代码库中的一个交叉问题。有一些不同的Java AOP解决方案。我已经将Spring AOP与动态代理一起使用,这不足以涵盖所有方法执行,但它足以覆盖在Spring容器中管理的bean的接口上定义的任何方法执行:

http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/aop.html

例如,我编写了一个TimingAspect,它包装了一个方法的执行,并在完成后记录它的执行时间。当我想使用它时,我更新我的Spring applicationContext.xml以指定我想要测量的方法的切入点。您可以定义类似的TracingAspect以在每个方法执行开始时打印调试消息。请记住将其关闭以进行生产部署。

对于所有这些方法,测量每个方法调用可能会导致信息过载。您可能希望有选择地仅测量自己的代码库中的一些重要部分,过滤掉核心JDK方法和第三方库。