TracerJD is a program execution Tracer for Java dynamic Dependence analysis. The major goal of this framework is to enable fine-grained dynamic dependence analysis for Java program based on program execution traces. It is developed in support of a wide range of dynamic dependence-based analyses such as those used in software testing, debugging, and evolution tasks.
With TracerJD, we are trying to provide a light software-based framework that supports fine-grained program execution tracing so as to enable fine-grained dynamic dependence analysis. There are potentially a variety of client analyses to be built on this framework as the core facilities of this framework is devoted to offere dynamic dependence information with respect to the given program inputs used for the application dynamic analyses on top of TracerJD.
The framework performs a whole-program static analysis that mainly instruments for fine-grained logging of dependence traces. The information traced lies in various levels of granularity, ranging from method level execution events to statement level coverage events and even variable level definition-use events. Optionally, variable values can be traced as well.
As part of the entire toolkit of TracerJD, three example application analyses are provided as well beside the core tracing framework, including a backward dynamic slicer, a statement-level performance profiler, and a test coverage reporter. All these client analyses enjoyed a great amount of ease in their construction for the sake of dedicated supporting facilities for dynamic dependence analysis in the core tracing framework.
One important feature of TracerJD is that it analyzes, by default, the entire program instead of particular program points of interest limited for specific tasks, as many debugging and dynamic slicing tools did. Such whole-program analysis enables a one-time static analysis whose results can be used by many client analyses with respect to any points of the program. In particular, all exceptional units of Java programs are covered in the static analysis, thus the traces generated by TracerJD include all dynamic dependence information due to exceptional control flows.
TracerJD supports interprocedural data dependence analysis that relies on (almost) NO static data-dependence analysis, which avoides the common imprecision issues of such static analysis due to imprecision in underlying computations such as points-to analysis. However, to support dynamic interprocedural control dependence analysis, TraccerJD creates a conversative interprocedural control dependence graph during static analysis and then computes precise dynamic control dependencies by leveraging the fine-grained dependence traces, in order to reduce instrumented code sizes, primarily striving for the efficiency of the holistic tracing framework.
The implementation of TracerJD is based on the Soot byte-code analysis and optimization framework. Part of this framework has been also applied to Diver (majorly for the interprocedural control dependence computation).
The main limitation of this framework lies in its full supports for concurrent program executions. And since the implementation has not been optimized yet, TracerJD can incur challenging time and space overheads for extremely long-running programs.
TracerJD and all its library dependencies can be downloaded from this page (see below). This framework and example tools built on it are all open source. See also all information here from the Sourceforge project site of TracerJD .