在运行时跟踪Java应用程序

7
我希望能在运行时跟踪Java应用程序,记录并分析其每个行为。是否有可能钩入Java应用程序以获取运行时信息,例如方法调用(带参数和返回值)以及对象状态(即其属性及其值)?我的目标是全面了解应用程序的行为以及如何处理数据。

这是一个愚蠢的问题,但你确保拥有源代码并且正在自己构建和运行这个程序,对吧? - Drew
1
需要澄清一下:这个应用程序是在您的本地计算机(开发环境)上运行,还是您也想在生产环境中分析这个跟踪? - manuel aldana
它正在我的本地开发环境中运行,是的,我有源代码,因此在编译之前修改源代码是可能的,但我更喜欢不修改源代码的解决方案。 - user241980
4个回答

5
如果需要高度定制的日志记录和运行时处理,与分析器的一个替代方案是使用方面加载时间编织
我们使用AspectJ以这种方式捕获和记录认证信息,以便用户调用一些低级方法进行调试目的和撤消错误更改。

好的,只是为了澄清:使用AspectJ和加载时织入,是否可以在方法被调用时获取每个参数及其实际值,并且还可以获取刚刚调用方法的对象的所有属性及其实际值? - user241980
是的,所有这些信息都应该通过thisJoinPointthisJoinPointStaticPart特殊对象可用; 这里的第二个示例应该可以帮助你入门:http://www.eclipse.org/aspectj/doc/released/progguide/examples-development.html#tracing-using-aspects 和 http://dev.eclipse.org/viewcvs/indextech.cgi/aspectj-home/doc/api/org/aspectj/lang/JoinPoint.html - ZoogieZork

1

使用分析器。例如JProfiler或者从这个概述的开源Java分析器中选择一个。每当我需要查找死锁时,这些工具都是无价之宝...


1

0
也许可以看一下 Glassbox,它是一个针对 Java 应用程序的故障排除代理,可以自动诊断常见问题。来自 Glassbox - Automated monitoring and troubleshooting using AOP
Glassbox以war文件的形式部署到您的应用服务器上,然后使用AspectJ加载时织入来监视应用程序组件和其他工件,以识别问题,例如过多或失败的远程调用、慢查询、过多的数据库查询、线程争用,甚至是导致故障的请求参数。所有这些都不需要更改代码或构建过程。(...)
Glassbox通过使用方面跟踪组件交互来非侵入性地监视应用程序。我们还监视内置的JMX数据,特别是在Java 5 VM上,我们采样线程数据(默认情况下每100毫秒)。当请求被处理时,我们总结值得注意的事件,例如花费时间的位置以及使事情变慢或失败的参数。我们还检测更高级别的操作(例如Struts操作或Spring控制器),并用于报告。我们的AJAX Web客户端然后提供正在监视的机器上按操作汇总的状态摘要,并在请求上生成更详细的分析。Glassbox允许监视服务器集群:Web应用程序使用JMX Remote或直接RMI从远程服务器访问数据。我们还提供对较低级别摘要统计信息的JMX远程访问。
这是一个很好的应用程序,试试看吧。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接