aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/_notes/gdb.md
diff options
context:
space:
mode:
authorEgor Tensin <egor@tensin.name>2026-06-06 22:23:54 +0200
committerEgor Tensin <egor@tensin.name>2026-06-06 22:24:45 +0200
commitbe5e0048913797f2ef91065908730da025113c34 (patch)
treedd16e4908bb93953dbc823d7624f76c363a00bf4 /_notes/gdb.md
parentbump dependencies (diff)
downloadblog-be5e0048913797f2ef91065908730da025113c34.tar.gz
blog-be5e0048913797f2ef91065908730da025113c34.zip
move Jekyll source files to src/
Diffstat (limited to '_notes/gdb.md')
-rw-r--r--_notes/gdb.md135
1 files changed, 0 insertions, 135 deletions
diff --git a/_notes/gdb.md b/_notes/gdb.md
deleted file mode 100644
index 47db5c9..0000000
--- a/_notes/gdb.md
+++ /dev/null
@@ -1,135 +0,0 @@
----
-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`.
-
- <div markdown="1" class="table-responsive">
- | List dumps | `coredumpctl`
- | Debug the last dump | `coredumpctl gdb`
- | Extract the last dump | `coredumpctl dump -o core`
- {: .table .table-bordered }
- </div>
-
-.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
-------
-
-<div markdown="1" class="table-responsive">
-
-| Run | `r`
-| Continue | `c`
-| Breakpoint at function | `b FUNC`
-| Breakpoint at address | `b *0xdeadbeef`
-| 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`
-| Switch to thread | `t N`
-| Disassemble | `disas FUNC`
-| Step over line | `n`
-| Step over instruction | `si`
-| Step out of frame | `fin`
-{: .table .table-bordered }
-
-</div>
-
-Hint: put this in your ~/.gdbinit and use `bta` as a shortcut:
-
- define bta
- thread apply all backtrace
- end
-
-Data inspection
----------------
-
-<div markdown="1" class="table-responsive">
-
-| 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 }
-
-</div>
-
-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