  A major part of debugging, testing, and analyzing a complex software system
is understanding what is happening within the system at run-time. Some
developers advocate running within a debugger to better understand the system
at this level. Others embed logging statements, even in the form of hard-coded
calls to print functions, throughout the code. These techniques are all
general, rough forms of what we call system monitoring, and, while they have
limited usefulness in simple, sequential systems, they are nearly useless in
complex, concurrent ones. We propose a set of new mechanisms, collectively
known as a monitoring system, for understanding such complex systems, and we
describe an example implementation of such a system, called IDebug, for the
Java programming language.
