# gdb(1) # CLI ```markdown gdb [opts] [prg [-c coredump | -p pid]] gdb [opts] --args prg opts: -p attach to pid -c use -x execute script before prompt -ex execute command before prompt --tty set I/O tty for debugee ``` # Interactive usage ## Misc ```markdown tty Set as tty for debugee. Make sure nobody reads from target tty, easiest is to spawn a shell and run following in target tty: > while true; do sleep 1024; done sharedlibrary [] Load symbols of shared libs loaded by debugee. Optionally use to filter libs for symbol loading. display [/FMT] Print every time debugee stops. Eg print next instr, see examples below. undisplay [] Delete display expressions either all or one referenced by . info display List display expressions. ``` ## Breakpoints ```markdown break [-qualified] thread Set a breakpoint only for a specific thread. -qualified: Treat as fully qualified symbol (quiet handy to set breakpoints on C symbols in C++ contexts) break if Set conditional breakpoint (see examples below). delete [] Delete breakpoint either all or one referenced by . info break List breakpoints. cond Make existing breakpoint conditional with . tbreak Set temporary breakpoint, will be deleted when hit. Same syntax as `break`. rbreak Set breakpoints matching , where matching internally is done on: .*.* command [] Define commands to run after breakpoint hit. If is not specified attach command to last created breakpoint. Command block terminated with 'end' token. : Space separates list, eg 'command 2 5-8' to run command for breakpoints: 2,5,6,7,8. save break Save breakpoints to . Can be loaded with the `source` command. ``` ## Watchpoints ```markdown watch [-location|-l] [thread ] Create a watchpoint for , will break if is written to. Watchpoints respect scope of variables, -l can be used to watch the memory location instead. rwatch ... Sets a read watchpoint, will break if is read from. awatch ... Sets an access watchpoint, will break if is written to or read from. ``` ## Inspection ```markdown info functions [] List functions matching . List all functions if no provided. info variables [] List variables matching . List all variables if no provided. ``` ## Signal handling ```markdown info handle [] Print how to handle . If no specified print for all signals. handle Configure how gdb handles sent to debugee. : stop/nostop Catch signal in gdb and break. print/noprint Print message when gdb catches signal. pass/nopass Pass signal down to debugee. catch signal Create a catchpoint for . ``` ## Source file locations ```markdown dir Add to the beginning of the searh path for source files. show dir Show current search path. set substitute-path Add substitution rule checked during source file lookup. show substitute-path Show current substitution rules. ``` ## Configuration ```markdown set disassembly-flavor Set the disassembly style "flavor". set follow-fork-mode Specify which process to follow when debuggee makes a fork(2) syscall. set pagination Turn on/off gdb's pagination. set breakpoint pending on: always set pending breakpoints. off: error when trying to set pending breakpoints. auto: interatively query user to set breakpoint. set print pretty Turn on/off pertty printing of structures. set logging Enable output logging to file (default gdb.txt). set logging file Change output log file to set logging redirect on: only log to file. off: log to file and tty. ``` # User commands (macros) Gdb allows to create & document user commands as follows: ```markdown define # cmds end document # docu end ``` To get all user commands or documentations one can use: ```markdown help user-defined help ``` # Hooks Gdb allows to create two types of command `hooks` - `hook-` will be run before `` - `hookpost-` will be run after `` ```markdown define hook- # cmds end define hookpost- # cmds end ``` # Examples ## Automatically print next instr When ever the debugee stops automatically print the memory at the current instruction pointer (`$rip` x86) and format as instruction `/i`. ```markdown # rip - x86 display /i $rip # step instruction, after the step the next instruction is automatically printed si ``` ## Conditional breakpoints Create conditional breakpoints for a function `void foo(int i)` in the debugee. ```markdown # Create conditional breakpoint b foo if i == 42 b foo # would create bp 2 # Make existing breakpoint conditional cond 2 if i == 7 ``` ## Catch SIGSEGV and execute commands This creates a `catchpoint` for the `SIGSEGV` signal and attached the `command` to it. ```markdown catch signal SIGSEGV command bt c end ``` ## Run `backtrace` on thread 1 (batch mode) ```markdown gdb --batch -ex 'thread 1' -ex 'bt' -p ``` ## Script gdb for automating debugging sessions To script gdb add commands into a file and pass it to gdb via `-x`. For example create `run.gdb`: ```markdown set pagination off break mmap command info reg rdi rsi rdx bt c end #initial drop c ``` This script can be used as: ```markdown gdb --batch -x ./run.gdb -p ``` ## Hook to automatically save breakpoints on `quit` ```markdown define break-save save breakpoint $arg0.gdb.bp end define break-load source $arg0.gdb.bp end define hook-quit break-save quit end ``` # Know Bugs ## Workaround `command + finish` bug When using `finish` inside a `command` block, commands after `finish` are not executed. To workaround that bug one can create a wrapper function which calls `finish`. ```markdown define handler bt finish info reg rax end command handler end ```