A debugger is software for executing a computer program in an environment that allows for programming-level inspection and control. A debugger is often used to debug, but can be used for other goals including testing. Common features of a debugger include stepping through code line-by-line, breaking into the program's flow of control, managing breakpoints, and reporting and modifying memory.
A source-level debugger (a.k.a. symbolic debugger) provides a user experience that integrates the program's source code. Typically, such a debugger can indicate which line of source code corresponds to the execution point of the program and allows for reading and writing memory via the symbols of the source code. In contrast, a low-level debugger (a.k.a. machine-language debugger) shows the execution point as machine code or its associated assembly language and allows memory access by address only.