The GNU Debugger, GDB, is more or less the defacto tool for debugging software running on a *nix (UNIX, Linux, BSD, Solaris, OS X, etc) system. It supports a wide variety of languages including Ada, C, C++, Objective-C, and Pascal, and can even be used to debug programs that are already running, or running on other machines. Whereas some tools are geared toward finding memory problems in running programs (Valgrind), or looking for security flaws and other bugs in source (Splint), GDB is geared primarily toward debugging logic problems.
GDB works by allowing the developer to step through their program one line at a time or to stop execution at a desired point, such as when a given function is called, a specific line is reached, or the value in a particular variable is changed. Once execution has been stopped, the develeper can take a look at the current value of variables or examine a stack trace to see what called the function.
This page is intended as a quick overview of GDB's various functions, rather than a comprehensive discussion of everything it can do. If you want to learn about GDB's more advanced functionality, the FSF provides a stunningly comprehensive set of documentation.
To use GDB effectively, your program must have been compiled using g++'s -g flag. If you're using a Makefile of the sort provided in class, you're set.
Assuming your program is named foo, you can invoke GDB using the command gdb foo.
As noted above, GDB provides developers with very, very fine-grained control over the execution of their program. Here are some commands for tapping into that control:
Command | When To Use | Function |
run | Once you've configured some breakpoints, or after the target has finished running. | Begins execution of the target program, and turns control over to same. The target will continue to execute until the first break / watch point is encountered, or the target exits, whichever comes first. |
step or s | Any time a running target is stopped | Run target until execution arrives at the next line of source code, then return control to GDB. Will enter or leave functions as necessary. |
next or n | Any time a running target is stopped | Works like step, except that it treats function calls as single lines, rather than expanding the function and stepping through it. |
until | Any time a running target is stopped | Same as next, except that it only steps through the body of a loop once. After the first pass, the loop runs to completion before returning control to GDB. |
finish | Any time a running target is stopped | Run until the current function returns, then give control back to GDB. Prints the return value of the function. |
continue or c | Any time a running target is stopped | Resume execution of the target and run until the next break / watch point or until the target exits, whichever is first. |
Most of the commands for controlling target execution rely on the target being stopped. The set of commands below can be used to cause GDB to automatically stop execution of the target when certain conditions are met. (As should be obvious, these can only be used when the program is stopped.)
Command | Parameters | Function |
break | line number or function name | Set a breakpoint to stop the target every time it reachs the specified line number or a call to the designated function. Use fully qualified function names for class member functions. A file name may be prepended to the line number or function in the case of ambiguity (eg foo.cpp:10). |
tbreak | line number or function name | Works like break, except the breakpoint will only stop execution once, rather than every time it is encountered. |
info breakpoints | none | Displays information about all currently set breakpoints. |
watch | variable name | Stop execution of the target any time the named variable is written to. Variable must be defined in the current scope, but you may set watchpoints on private class members. Watchpoints are automatically deleted when they are no longer in the current scope. |
rwatch | variable name | Like watch but stops when the variable is read, rather than written. |
awatch | variable name | Like watch or rwatch, but stops for both read and write. |
info watchpoints | none | Displays information about all currently set watchpoints. |
delete | breakpoint or watchpoint | Delete the specified breakpoint or watchpoint, so it will no longer stop execution of the target. |
In addition to providing control over the execution of a target program, GDB is also able to display the contents of variables within the program. This is especially helpful when trying to analyze how or why a variable is changing. Here are some commands for displaying variables.
Command | Parameters | Function |
print or p | variable name | Displays the contents of the variable. In the case of pointers, prints out the address to which the pointer points. Only the contents of variables which are currently in-scope can be printed. |
display | variable name | Similar to print, but automatically prints the contents of the variable whenever target execution is stopped while the variable is in-scope. |
info display | none | Prints out information about any currently set automatic displays. |