Abstract
Complex applications today involve multiple processes, multiple threads of control, distributed processing, thread pools, event handling, messages. The behaviors and misbehaviors of these nondeterministic, message-based systems are difficult to capture and understand. The typical approach is to trace the behavior of the systems and track how the different incoming messages are processed throughout the system. While messages between processes can be captured automatically at the network or library level, tracing the message processing within a system, which is often more complex and error-prone, requires the programmer to manually instrument the code by identifying the different message handlers, thread states, processing stages, and shared queues accurately and completely. In this paper we show how dynamic analysis can be used to automatically identify the transactions, stages and shared queues in Java programs as a prelude to trace-based comprehension.