GDB Debugging
Compile with Debug Information
To allow gdb
access to the source code (Provides debug symbols - Do not share publicly as it contains the source code).
gcc -g <file>
Look for / Fix Bugs
First, initialize gdb
with the executable to debug.
gdb ./<executable> --tui
After gdb
is ready, we can use the following commands:
Command | Description |
---|---|
lay next | Switch to the next layout (Enables TUI mode if disabled - Allows for reading the code while debugging both in C and ASM ). |
ref | Refresh (if a program prints to the terminal, it can break gdb ’s interface).` |
q | Quit gdb . |
b main | Add a breakpoint at the main function. |
b | Place a breakpoint at the current line. |
b <N> | Place a breakpoint at line N . |
b +<N> | Place a breakpoint N lines down. |
b <fn> | Place a breakpoint at fn function. |
d | Delete all breakpoints. |
d <N> | Delete breakpoint number N . |
clear <fn> | Clear the breakpoint set to fn function. |
n | Execute up to the next line in C . If a function call is found, execute the function completely. |
s | Execute up to the next line in C . (Jump over) |
s <N> | Run N lines. |
u | Same as n , but if in a loop, execute until the loop exits. |
nexti | Execute up to the next instruction (line in ASM ). |
r | Run the program until a breakpoint or error is reached. |
c | Continue running the program until a breakpoint or error is reached. |
x/i $pc | Examine the previous instruction (View memory). |
info registers | Read the CPU registers used by the program. |
bt | See the call stack up to the current line. (How we got here, so to speak) |
print sizeof(<variable>) | Check the size of a struct/variable/pointer. |
p <var> | Print variable var value. |
info break | List breakpoints. |
Check for Memory Leaks
Use valgrind
to check for lost memory.
valgrind --leak-check=full ./<executable>