我希望能够可视化给定JVM进程的调用顺序(调用哪些方法调用哪些对象以及哪些参数通过)。例如一个将这些信息转储到文件的工具。 有没有现成的工具来做到这一点?如果不是,你能否指出如何做到这一点?你可以建议哪些解决方案(除了修改方法的字节码)?Java调用序列分析
回答
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> }
}
你去定义“呼叫”你喜欢的对象,记录结果。如果你想在那里放置额外的过滤器来消除来自错误线程的数据,或者不在某个时间窗口之间,或者不接近某个有趣的事件,你可以。这可能会减慢你的应用程序的运行速度,至少如果你让这个程序员通过你的应用程序执行每个函数调用的话。 (更复杂的转换可以控制它们的应用位置)。
我已经通过Eclipse调试器查看了Java调用堆栈的最佳方式。如果你只是在你的代码中放置断点,你将能够遍历代码并查看调用堆栈。
我想在整个应用程序中查看给定时间段内的调用序列,而不仅仅是调用堆栈。 – Eugen 2011-05-24 12:48:58
- 1. Java调用层次分析
- 2. 分析序列matlab
- 3. 分析调用Runtime.freeMemory()的java代码
- 4. 分析Java通过JNI运行调用
- 5. Java应用程序分析/跟踪
- 6. 分析多线程Java应用程序
- 7. java应用程序的性能分析
- 8. 远程分析Java应用程序
- 9. 分析Java EE应用程序
- 10. 排列顺序/序列分析
- 11. JRAT使用Java运行时分析工具来分析简单的Java程序
- 12. 时间序列分析
- 13. XSD XML分析xs:序列
- 14. Java性能分析,性能调整和内存分析练习
- 15. 使用PIL/Tkinter分析图像序列
- 16. 时间序列分析的适用性?
- 17. Java序列与非序列化部分
- 18. Java分析 - VisualVM
- 19. Java库,用于分析HTML
- 20. Java中的等分序列
- 21. JavaCC分析函数调用
- 22. 将Ajax调用分析
- 23. 只分析Java应用程序的某些部分/类
- 24. Java程序的静态污点分析
- 25. Java的文本分析程序
- 26. Java的文本分析程序
- 27. 从Java程序分析C++文件
- 28. java程序的动态分析
- 29. 如何在使用Java的Windows中分析系统调用?
- 30. 程序分析和单调函数
这是类似于这个问题:http://stackoverflow.com/questions/1025681/call-trace-in-java – Eugen 2011-05-24 15:24:10
我认为Java记录工具做到了这一点。 – 2011-06-02 06:17:46
是的,但您必须手动插入所有日志调用。对于一个大型项目来说,这不是一个可行的选择,是吗? – Eugen 2011-06-30 14:50:46