Through advances in emulators, debuggers, and logic analyzers, developers of real-time embedded systems now have many debugging capabilities available to them. Such capabilities provide the user of these tools with visibility into critical aspects of system execution and performance, and many can be used non-intrusively as the processor executes. While these tool capabilities exist, little practical information exists on how to effectively utilize these real-time debugging capabilities.