When software is being developed, the software may not behave as the programmer expects. A debugger may be used to analyze the behavior of the program and/or to experiment with varying execution scenarios, which may provide clues as to the source of the unexpected behavior.
Debuggers can be “out-of-process” or “in-process.” An out-of-process debugger is an application that acts on program that is being debugged (the debuggee) from outside of the process in which the debuggee executes. The debuggee exposes inspection and control models to the out-of-process debugger, which provides a rich interface from which the debugger can examine the debuggee's process and manipulate the debuggee's execution. Modern execution environments typically provide an infrastructure that facilitates implementation of an out-of-process debugger. An in-process debugger is built into the development software in which code is being developed. For example, a command-line language interpreter could have debugging commands hard-coded into the interpreter, so that the debug commands can be accessed from the interpreter's command-line interface.
In-process debuggers provide a simple user experience, in that the user can write and debug code in one process through one user interface, and the debugging support is integrated with the execution environment. Out-of-process debuggers, on the other hand, use the debugging infrastructure that several execution environments provide to support the out-of-process model. Debuggers that provide the in-process user experience have not made use of this infrastructure.