[1b34b87] | 1 | \chapter{GNU Debugger} \label{GDB}
|
---|
| 2 |
|
---|
| 3 | \section{Introduction}
|
---|
| 4 | The GNU Project Debugger is a program that allows examination of what is going on
|
---|
| 5 | inside another program while it executes, or examines the state of a program
|
---|
| 6 | after it crashed \cite{Reference3}.
|
---|
| 7 |
|
---|
| 8 | \section{Debug Information}
|
---|
| 9 | In order to allow effective inspection of program state, the
|
---|
| 10 | debugger requires debugging information for a program. Debugging
|
---|
| 11 | information is a collection of data generated by a compiler and/or an assembler
|
---|
| 12 | program. This information is optional as it is only required for compilation,
|
---|
| 13 | and hence, it is normally not present during program execution when debugging
|
---|
| 14 | occurs. When requested, debugging information is stored in an object file, and it describes
|
---|
| 15 | information such as the type of each variable or function and
|
---|
| 16 | the correspondence between source line numbers and addresses in the executable
|
---|
| 17 | code \cite{Reference6}. Debugging information is requested via the \verb|-g|
|
---|
| 18 | flag during the compilation stage of the
|
---|
| 19 | program.
|
---|
| 20 |
|
---|
| 21 | The debugging information must be written out in a canonical format for
|
---|
| 22 | debuggers to read. DWARF is one of the supported debugging data formats, and its architecture is
|
---|
| 23 | independent and applicable to any language, operating system, or processor \cite{Reference7}. This format uses a data structure called DIE to represent
|
---|
| 24 | each variable, type, function, etc. A DIE is a pair: tag
|
---|
| 25 | and its attribute \cite{Reference8}.
|
---|
| 26 |
|
---|
| 27 | \section{Stack-Frame Information}
|
---|
| 28 | A stack frame, or frame for short, is a collection of all data associated with
|
---|
| 29 | one function call. A frame consists of parameters received from the function call, local variables declared in that
|
---|
| 30 | function, and the address where the
|
---|
| 31 | function returns. The frame-pointer register stores the address of a frame,
|
---|
| 32 | during execution of a call. A call stack can have many frames \cite{Reference12}.
|
---|
| 33 |
|
---|
| 34 | \section{Extending GDB}
|
---|
| 35 | GDB provides three mechanisms for extending itself. The first is
|
---|
| 36 | composition of GDB commands, the second is using the Python GDB API, and the third is defining new aliases for existing commands.
|
---|
| 37 |
|
---|
| 38 | \section{Symbol Handling}
|
---|
| 39 | Symbols are a key part of GDB's operation. Symbols can be variables, functions and
|
---|
| 40 | types. GDB has three kinds of symbol tables:
|
---|
| 41 | \begin{itemize}
|
---|
| 42 | \item \textcolor{ForestGreen}{Full symbol-tables (symtabs)}: These contain the main information
|
---|
| 43 | about symbols and addresses
|
---|
| 44 | \item \textcolor{ForestGreen} {Partial symbol-tables (psymtabs)}: These contain enough information to
|
---|
| 45 | know when to read the corresponding part of the full symbol-table.
|
---|
| 46 | \item \textcolor{ForestGreen}{Minimal symbol-tables (msymtabs)}: These
|
---|
| 47 | contain information extracted from non-debugging symbols.
|
---|
| 48 | \end{itemize}
|
---|
| 49 |
|
---|
| 50 | Debugging information for a large program can be very large, and reading all of
|
---|
| 51 | these symbols can be a performance bottleneck in GDB, affecting the user
|
---|
| 52 | experience. The solution is to lazily construct partial symbol-tables consisting of
|
---|
| 53 | only selected symbols, and then eagerly expand them to full symbol-tables when
|
---|
| 54 | necessary.
|
---|
| 55 | The psymtabs is constructed by doing a quick pass over the executable file's
|
---|
| 56 | debugging information.
|
---|
| 57 |
|
---|
| 58 | \section{Name Demangling in GDB}
|
---|
| 59 | The library \verb|libiberty| provides many functions and features that can be
|
---|
| 60 | divided into three groups:
|
---|
| 61 | \begin{itemize}
|
---|
| 62 | \item \textcolor{ForestGreen}{Supplemental functions}: additional functions
|
---|
| 63 | that may be missing in
|
---|
| 64 | the underlying operating system.
|
---|
| 65 | \item \textcolor{ForestGreen}{Replacement functions}: simple and unified equivalent functions for
|
---|
| 66 | commonly used standard functions.
|
---|
| 67 | \item \textcolor{ForestGreen}{Extensions}: additional functions beyond the standard.
|
---|
| 68 | \end{itemize}
|
---|
| 69 |
|
---|
| 70 | In particular, this library provides the \CC demangler that is used in GDB and
|
---|
| 71 | by \uC. A new
|
---|
| 72 | demangler can also be added in this library, which is what Rust did, and what
|
---|
| 73 | is necessary for \CFA.
|
---|