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 CandASM). | 
| 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 fnfunction. | 
| d | Delete all breakpoints. | 
| d <N> | Delete breakpoint number N. | 
| clear <fn> | Clear the breakpoint set to fnfunction. | 
| 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 Nlines. | 
| 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 varvalue. | 
| info break | List breakpoints. | 
Check for Memory Leaks
Use valgrind to check for lost memory.
valgrind --leak-check=full ./<executable>