A system for debugging targets using various techniques, some of which are
particularly useful in a multithread environment. These techniques
include implementing breakpoints using out-of-line instruction emulation
so that an instruction replaced with a breakpoint instruction does not
need to be returned to its original location for single-step execution,
executing a debugger nub for each target as part of the target task but
using a nub task thread for the nub execution that is separate from the
target task threads, providing immunity from breakpoints for specified
threads such as the nub thread via specialized breakpoint handlers used
by those threads, and virtualizing the debugger nub such that a shared
root nub provides a uniform interface between the debugger and the target
while specialized nubs provide differing functionality based on the type
of target being debugged.