How to generate a Java call graph

不打扰是莪最后的温柔 提交于 2019-11-27 13:52:17

问题


I'd like to analyze and understand a certain Java app and I think a call graph would be very useful. How do I generate one? I'm using Eclipse.


回答1:


Getting callstack

1) If you can debug the application simply put a breakpoint (double click over the left margin of the code) and wait it to stop. Go to Debug Perspective if you're not there, and open the Call stack View/Panel. It has the call stack :)

2) If you want to print this stack trace somewhere use an Exception:

Exception aux = new Exception("I'm here"); // not for throwing!
aux.printStackTrace(); // if you want it in stdout

or

Exception aux = new Exception("I'm here"); // not for throwing!
StringWriter sw = new StringWriter();
aux.printStackTrace(new PrintWriter(sw));
String result = sw.toString(); // if you want it in a string

Obtaining method references

You can obtain all references to a method by right-clicking, References, Workspace. It will search all callings in your current open projects. Very very useful.

Profiling an app

(thanks those who had answered the profiler option)

Eclipse TPTP provides profiling:

http://www.eclipse.org/tptp/home/project_info/general/whatisTPTP.php




回答2:


I had exactly the same problem, so I 've written the java-callgraph suite of tools. Using it, you can create both dynamic (runtime) call graphs and static call graphs, provided that you have the program's and its dependencies' jar files.




回答3:


Netbeans profiler is very good for this !!

The profiling functions include CPU, memory and threads profiling as well as basic JVM monitoring ...

You can also use jconsole command (part of the jdk)

It launches a graphical console tool that enables you to monitor and manage Java applications and virtual machines on a local or remote machine.




回答4:


Using the Eclipse Profiler might get you what you want.




回答5:


Fast and dirty, create a new exception and print the stacktrace.

Exception e = new Exception();
e.printStackTrace();



回答6:


You cannot get a graph for the entire code in eclipse. However, you can get a tree view of callers or callees for a method.

In the source code, right-click on the name of a method of interest, say main(String[] args), then click on Open Call Hierarchy. (Ctrl+Alt+H on Windows)

This will open a tree view of the hierarchy of callers (Caller Hierarchy). There is an option to view the Callee Hierarchy.

To copy to a text file, right-click on a node in the Call Hierarchy view and click on Copy Expanded Hierarchy.

Drawbacks:

  • expanding all tree nodes must done expanded manually (Shift+tap Right arrow repeatedly on Windows)
  • if there is not obvious starting point to the code, you'll have to do this for every method



回答7:


I use the Eclipse profiler sometimes.




回答8:


Thread.dumpStack() allows you to output the current call stack without throwing an exception or using a debugger. This will be output to the console.

You could put a call to dumpStack() in "hotspots" of your code to get the calling stack the application took to get to that point.



来源:https://stackoverflow.com/questions/1982890/how-to-generate-a-java-call-graph

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!