Enabling Modularity and Re-use in Dynamic Program Analysis Tools for the Java Virtual Machine

Dynamic program analysis tools based on code instrumentation serve many important software engineering tasks such as profiling, debugging, testing, program comprehension, and reverse engineering. Unfortunately, constructing new analysis tools is unduly difficult, because existing frameworks offer little or no support to the programmer beyond the incidental task of instrumentation. We observe that existing dynamic analysis tools re-address recurring requirements in their essential task: maintaining state which captures some property of the analysed program. This paper presents a general architecture for dynamic program analysis tools which treats the maintenance of analysis state in a modular fashion, consisting of mappers decomposing input events spatially, and updaters aggregating them over time. We show that this architecture captures the requirements of a wide variety of existing analysis tools.

[1]  Kathryn S. McKinley,et al.  Dynamic shape analysis via degree metrics , 2009, ISMM '09.

[2]  Oscar Naim,et al.  MDL: a language and compiler for dynamic program instrumentation , 1997, Proceedings 1997 International Conference on Parallel Architectures and Compilation Techniques.

[3]  Kathryn S. McKinley,et al.  Error-free garbage collection traces: how to cheat and not get caught , 2002, SIGMETRICS '02.

[4]  Stephen N. Freund,et al.  The RoadRunner Dynamic Analysis Framework for Concurrent Programs , 2010, PASTE '10.

[5]  Walter Binder,et al.  DiSL: a domain-specific language for bytecode instrumentation , 2012, AOSD.

[6]  Harish Patil,et al.  Pin: building customized program analysis tools with dynamic instrumentation , 2005, PLDI '05.

[7]  Jørgen Lindskov Knudsen ECOOP 2001 — Object-Oriented Programming , 2001, Lecture Notes in Computer Science.

[8]  Byung-Gon Chun,et al.  TaintDroid: An Information-Flow Tracking System for Realtime Privacy Monitoring on Smartphones , 2010, OSDI.

[9]  John Zukowski The Definitive Guide to Java Swing , 2000 .

[10]  Shigeru Chiba,et al.  Load-Time Structural Reflection in Java , 2000, ECOOP.

[11]  Amer Diwan,et al.  The DaCapo benchmarks: java benchmarking development and analysis , 2006, OOPSLA '06.

[12]  James R. Larus,et al.  Exploiting hardware performance counters with flow and context sensitive profiling , 1997, PLDI '97.

[13]  Shriram Krishnamurthi,et al.  Flapjax: a programming language for Ajax applications , 2009, OOPSLA 2009.

[14]  Walter Binder,et al.  Parallel dynamic analysis on multicores with aspect-oriented programming , 2010, AOSD.

[15]  Martin Odersky,et al.  Deprecating the Observer Pattern with Scala.React , 2012 .

[16]  Matthias Hauswirth,et al.  Listener latency profiling: Measuring the perceptible performance of interactive Java applications , 2011, Sci. Comput. Program..

[17]  Antony Courtney,et al.  Frappé: Functional Reactive Programming in Java , 2001, PADL.

[18]  Nicholas Nethercote,et al.  Valgrind: a framework for heavyweight dynamic binary instrumentation , 2007, PLDI '07.

[19]  Muga Nishizawa,et al.  An Easy-to-Use Toolkit for Efficient Java Bytecode Translators , 2003, GPCE.

[20]  Eric Bodden,et al.  Racer: effective race detection using aspectj , 2008, ISSTA '08.

[21]  Oscar Nierstrasz,et al.  Exploiting Dynamic Information in IDEs Improves Speed and Correctness of Software Maintenance Tasks , 2012, IEEE Transactions on Software Engineering.

[22]  Josef Weidendorfer,et al.  Sequential Performance Analysis with Callgrind and KCachegrind , 2008, Parallel Tools Workshop.

[23]  Robert E. Strom,et al.  Typestate: A programming language concept for enhancing software reliability , 1986, IEEE Transactions on Software Engineering.

[24]  Wenguang Chen,et al.  Do I use the wrong definition?: DeFuse: definition-use invariants for detecting concurrency and sequential bugs , 2010, OOPSLA.

[25]  Samuel Z. Guyer,et al.  Elephant Tracks: generating program traces with object death records , 2011, PPPJ.

[26]  Bryan Cantrill,et al.  Dynamic Instrumentation of Production Systems , 2004, USENIX Annual Technical Conference, General Track.

[27]  Stephen N. Freund,et al.  FastTrack: efficient and precise dynamic race detection , 2009, PLDI '09.

[28]  Elisa Bertino,et al.  ECOOP 2000 — Object-Oriented Programming , 2000, Lecture Notes in Computer Science.

[29]  Michael Burrows,et al.  Eraser: a dynamic data race detector for multithreaded programs , 1997, TOCS.

[30]  Vikram S. Adve,et al.  LLVM: a compilation framework for lifelong program analysis & transformation , 2004, International Symposium on Code Generation and Optimization, 2004. CGO 2004..

[31]  Koushik Sen,et al.  CUTE: a concolic unit testing engine for C , 2005, ESEC/FSE-13.

[32]  Susan L. Graham,et al.  Gprof: A call graph execution profiler , 1982, SIGPLAN '82.

[33]  William G. Griswold,et al.  An Overview of AspectJ , 2001, ECOOP.

[34]  Frank Yellin,et al.  The Java Virtual Machine Specification , 1996 .

[35]  Gregor Kiczales,et al.  Using aspectC to improve the modularity of path-specific customization in operating system code , 2001, ESEC/FSE-9.