是否可以在java中转储完整的程序执行?我必须通过一个完整的流程来执行特定的输入值.使用step over,step into有点耗时,我想知道是否有任何java命令转储执行?
也许你想看看Chronon Time Travel Debugger.
我还没有尝试过,经过长时间的测试后,似乎现在正式可用,可能满足您的要求.它是商业产品,但提供免费试用期.
另一种替代方法可能是使用随JDK提供的jsadebugd实用程序对核心文件进行调试.(你不能前进和后退,但你可以检查所有线程的堆栈/监视器,这可能对你有帮助)
如果您只需要方法调用,如注释中所述,也许使用jprofiler或yourkit等工具的探查器也会有所帮助.
或者你想看看btrace,一个类似dtrace的工具.
如果你能够修改/构建应用程序,那么某种小型AOP方法拦截器也可以完成这项任务.
如果我理解正确的话,您需要类似程序处理某些输入集时发生的所有方法调用的视图。您通常可以从探查器(例如 JProbe)中获取此类信息:
您可以在 JProbe 下运行该程序,然后它将呈现所有方法调用的可视化调用图或所有方法调用及其执行频率的列表。
有些相关的是静态分析工具,例如理解:
静态分析工具往往侧重于弄清楚整体代码结构,而不是一组特定输入所发生的情况。
当然,您始终可以更改代码,但是更改大型系统中的每个方法来打印调试字符串可能会需要太多工作。面向方面的编程往往是解决此类问题的好方法,因为它是跨代码库的横切关注点。有几种不同的 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 方法和第三方库。
归档时间: |
|
查看次数: |
236 次 |
最近记录: |