A debugger that shows the programmer the line or expression in the source code that resulted in a particular machine code instruction of a running program loaded in memory. This helps the programmer to analyse a program's behaviour in the high-level terms like source-level flow control constructs, procedure calls, named variables, etc instead of machine instructions and memory locations. Source-level debugging also makes it possible to step through execution a line at a time and set source-level breakpoints. In order to support source-level debugging, the program must be compiled with this option enabled so that extra information is included in the executable code to identify the corresponding positions in the source code. A symbolic debugger is one level lower - it displays symbols (procedure and variable names) stored in the executable but not individual source code lines. GDB is a widely used example of a source-level debugger.