This system sets up a framework that allows for separating debug
information from executable code. The system is comprised of a compiler, a
linker and a debugger. The compiler produces optimized object code and a
debugging information file that contains information necessary for
symbolic debugging. The linker merges the optimized object files to
produce an optimized executable file as well as debugging information
files to produce a composite debugging information file. This debugging
information file can be further refined when the program is executed to
include runtime dependencies. The debugger provides a source code
debugging environment and a core dump debugging environment for the
optimized code. The debugger allows monitoring of variable values,
placement of watches on changes in variable values, setting breakpoints by
location or by name and performing program debugging at a source code
level. The effects of optimization is "undone" by the debugger as well as
being able to perform symbolic analysis of core files from optimized code
dumps.