Chathuranga Chandrasekara
Chathuranga Chandrasekara

Reputation: 20906

Finding the actual runtime call tree of a Java Program

Suppose I have a big program that consists of hundreds of methods in it. And according to the nature of input the program flow is getting changed.

Think I want to make a change to the original flow. And it is big hassle to find call hierarchy/ references and understand the flow.

Do I have any solution for this within Eclipse? Or a plugin? As an example, I just need a Log of method names that is in order of time. Then I don't need to worry about the methods that are not relevant with my "given input"

Update : Using debug mode in eclipse or adding print messages are not feasible. The program is sooooo big. :)

Upvotes: 1

Views: 2457

Answers (2)

Ira Baxter
Ira Baxter

Reputation: 95354

If all you want to know is what methods got called, rather than the precise order, you might consider using a test coverage tool. These tools instrument the source code to collect "this got executed" facts at various degrees of granularity (method call only, and/or every code block controlled by a conditional).

The SD Test Coverage Tool is a tool that will do this.

It won't collect the call graph or even the order of the calls.

If you want more control over the instrumentation, you can consider using the DMS Software Reengineering Toolkit. DMS will parse, transform, and prettyprint Java in arbitrary ways controlled by custom source-to-source program transformation rewrite rules. It would be easy to insert logging transformations into the start and exit of each method (and in fact this is almost exactly how the SD test coverage tool works). Given the raw enter-X and exit-X data, constructing the runtime call tree is a straightforward task.

Upvotes: 1

VonC
VonC

Reputation: 1324576

You could use AspectJ to log the name of all methods called without changing your original program.

See tracing for instance.

aspect SimpleTracing {
    pointcut tracedCall():
        call(void FigureElement.draw(GraphicsContext));

    before(): tracedCall() {
        System.out.println("Entering: " + thisJoinPoint);
    }
}

Upvotes: 5

Related Questions