--- title: GDB subtitle: cheat sheet links: - {rel: stylesheet, href: 'assets/css/gdb.css'} --- Core dumps ---------- * Where are my core dumps? cat /proc/sys/kernel/core_pattern * Put core dumps in a directory: mkdir /coredumps chmod 0777 /coredumps echo '/coredumps/core.%e.%p' | tee /proc/sys/kernel/core_pattern * Still no dumps :-( ulimit -c unlimited * If dumps are piped to systemd-coredump, you can examine them using `coredumpctl`.
| List dumps | `coredumpctl` | Debug the last dump | `coredumpctl gdb` | Extract the last dump | `coredumpctl dump -o core` {: .table .table-bordered }
.gdbinit -------- # Without these, gdb is hardly usable: set pagination off set confirm off set print pretty on # Save history: set history save on set history filename ~/.gdb-history set history size 10000 Basics ------
| Run | `r` | Continue | `c` | Create breakpoint | `b FUNC` | List breakpoints | `i b` | Disable breakpoint | `dis N` | Enable breakpoint | `en N` | Delete breakpoint | `d N` | Call stack | `bt` | Call stack: all threads | `thread apply all bt` | Go to frame | `f N` | Disassemble | `disas FUNC` | Step over line | `n` | Step over instruction | `si` | Step out of frame | `fin` {: .table .table-bordered }
Hint: put this in your ~/.gdbinit and use `bta` as a shortcut: define bta thread apply all backtrace end Data inspection ---------------
| Disassemble 5 instructions | `x/5i 0xdeadbeef` | Print a 64-bit address | `x/1xg 0xdeadbeef` | Print a 32-bit address | `x/1xw 0xdeadbeef` | Print anything | `p sa->__sigaction_handler.sa_handler` | Describe a type | `ptype struct sigaction` | Describe a type with offsets | `ptype /o struct sigaction` | Disassemble all code sections | `objdump -d /proc/self/exe` | Disassemble a single section | `objdump -d -j .init /proc/self/exe` | Display the section contents | `objdump -s -j .data /proc/self/exe` {: .table .table-bordered }
Hint: put this in your ~/.gdbinit: define xxd dump binary memory /tmp/dump.bin $arg0 ((char *)$arg0)+$arg1 shell xxd -groupsize 1 /tmp/dump.bin shell rm -f /tmp/dump.bin end You can then use `xxd ADDR LEN` to display, in my opinion, the best formatting for memory dumps: (gdb) xxd main 24 00000000: f3 0f 1e fa 41 57 41 89 ff bf 05 00 00 00 41 56 ....AWA.......AV 00000010: 49 89 f6 41 55 41 54 55 I..AUATU Debuginfod ---------- If your distribution provides a Debuginfod server, use it! For example, see [Arch], [Debian], [Fedora]. In ~/.gdbinit, add set debuginfod enabled on [Arch]: https://wiki.archlinux.org/title/Debuginfod [Debian]: https://wiki.debian.org/Debuginfod [Fedora]: https://fedoraproject.org/wiki/Debuginfod Intel syntax ------------ This is just me being a baby duck. In ~/.gdbinit: set disassembly-flavor intel With `objdump`: objdump -Mintel -d /proc/self/exe