2011-05-24 37 views
2

我希望能够可视化给定JVM进程的调用顺序(调用哪些方法调用哪些对象以及哪些参数通过)。例如一个将这些信息转储到文件的工具。 有没有现成的工具来做到这一点?如果不是,你能否指出如何做到这一点?你可以建议哪些解决方案(除了修改方法的字节码)?Java调用序列分析

+0

这是类似于这个问题:http://stackoverflow.com/questions/1025681/call-trace-in-java – Eugen 2011-05-24 15:24:10

+0

我认为Java记录工具做到了这一点。 – 2011-06-02 06:17:46

+0

是的,但您必须手动插入所有日志调用。对于一个大型项目来说,这不是一个可行的选择,是吗? – Eugen 2011-06-30 14:50:46

回答

1

OP说,“Java日志记录”不好。 “是的,但你必须手动插入所有的日志调用,对于一个大型项目来说不是一个非常可行的选择,是吗?”

好的,您需要的是一种将自定义检测仪自动插入到您的应用程序中的方法。

我们的DMS Software Reengineering Toolkit及其Java Front End可以用来做到这一点。 DMS提供通用的机制来解析源代码,构建AST和符号表,分析特殊情况下的代码(树),并对代码(树)进行转换,最终从修改后的树中重新生成修改过的代码。 Java前端使DMS能够为Java执行此操作; DMS还有许多其他的前端语言模块。

你想要做的是一个DMS源到源变换写入到仪器与逻辑函数入口转储参数列表值(例如,它们的序列化“的toString”当量):

tag RecordArguments(a:arguments):statements; 

instrument_function_entry rule(r:type,m:identifier,a:arguments,s:stmts):method->method 
    "\r \m(\a) { \s } " 
    -> 
    "\r \m(\a) { Call.FunctionEntry(\stringify\(\m\));\RecordArguments\(\a\); { \s } }" 

empty_arguments rule() arguments -> statements 
    "\RecordArguments\(\) " -> ";" 

more_arguments rule (args:arguments,a:argument) arguments -> statements 
    "\RecordArguments\(\args,\a)" 
    -> "\RecordArguments\(\args\);Call.Argument(\a.toString()))" 

“instrument_function_entry”规则的作用是发出一个调用来记录函数条目,并生成一系列调用来记录参数值。 “empty_arguments”规则处理了要处理的no-more-arguments的基本情况(包括“根本没有参数”)。 “more_arguments”规则处理一系列参数,方法是拾取最后一个参数,生成转储该参数的代码,并生成一个由同一个规则或最终“empty_arguments”规则处理的剩余参数列表。

什么这应该产生的方法:

int X3(char J, array[] X) 
{ <code> } 

int X3(char J, array[] X) 
{ Call.FunctionEntry("X3"); 
    Call.Argument(J.toString()); 
    Call.Argument(X.toString()); 
    { <code> } 
    } 

你去定义“呼叫”你喜欢的对象,记录结果。如果你想在那里放置额外的过滤器来消除来自错误线程的数据,或者不在某个时间窗口之间,或者不接近某个有趣的事件,你可以。这可能会减慢你的应用程序的运行速度,至少如果你让这个程序员通过你的应用程序执行每个函数调用的话。 (更复杂的转换可以控制它们的应用位置)。

0

我已经通过Eclipse调试器查看了Java调用堆栈的最佳方式。如果你只是在你的代码中放置断点,你将能够遍历代码并查看调用堆栈。

+0

我想在整个应用程序中查看给定时间段内的调用序列,而不仅仅是调用堆栈。 – Eugen 2011-05-24 12:48:58

0

我认为最简单的就是使用JPDA(Java平台调试器架构)。您将不得不暂停所有线程,分析,转储信息并恢复线程。这不会是微不足道的,但从第一看应该是可能的。

+0

如何调用并返回的方法?他们不会在垃圾场,对吧? – Eugen 2011-05-24 12:48:52

+0

线程执行是一个非常动态的事情,当然,如果你按照我的建议,你会看到一个快照。您可能会尝试制作多个这样的快照,但仍不能为您提供100%的覆盖率。 恐怕,如果您想要确切的细节,您将无法避免字节码操作。你可以看看一些开源的性能分析和/或代码覆盖率分析工具来了解一个想法。 – aav 2011-05-24 13:02:47