title: Using GDB keywords:gdb,debug,linux # Using GDB GDB is gnu debugger that excists for years and it work on any linux/bsd supported platform. And time to time there is situation when you definetly whant debuger, just becouse of our favorite segfaults or just becose whant to solve at weekends evening some crackme. If you hace used some before some DOS debugers like Borland Turbo Debuger or just debug then comparing to gdb this are easy to use tools, and if you compare to OllyDbg then gdb is just nightmare =]. But yea there is no other choice then that ([ald](http://ald.sourceforge.net/)). Will add main points that are need to know to run/debug programm. With time more stuff will added ## Run ```bash gdb [PROGRAM] ``` Run program ``` (gdb) run [CMD LINE PARAMS TO PROGRAM] ``` Load ELD fileas with stuff and symbols ```bash load file.elf file file.elf ``` ## Setting breakpoints ### Speific address ```bash (gdb) break *0x800000 ``` ### Function ```bash (gdb) break _start ``` ### Source line ```bash (gdb) break src/main.c:12 ``` ### List breakpoints ```bash (gdb) info b ``` ### Delete breakpoints ```bash (gdb) clear src/main.c:12 ``` Here is more breakpoint types [Link1](http://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_28.html) and [Link2](http://www.unknownroad.com/rtfm/gdbtut/gdbbreak.html) ## Print registers ### Intel platform General purpose register values ```bash (gdb) p $eax (gdb) p $ebx (gdb) p $ebp ``` print value in hex ```bash (gdb) p/x $eax ``` ### ARM print value of memmory using register ```bash x/10x $sp ``` ## Print memory ### Byte print one byte from specific adress ```bash (gdb) x/u *0x808080 ``` ### Array print 16 bytes in hex ```bash (gdb) x/16xu *0xffffd310 ``` print from pointer value array ```bash (gdb) print/x *array_var@123 ``` ### Register value ```bash (gdb) x/4xb $ebp-0xc ``` ### Print current position instruction ```bash (gdb) x/i $pc ``` ### Structure turn on more nicer structure otutput ```bash set print pretty on ``` ```bash (gdb) ptype SPI_HandleTypeDef ``` ## Step ```bash (gdb) step (gdb) next ``` ## Show source code ### Show current instruction ```bash => 0x801a0 : ldr w1, [x2] (gdb) x/i $pc ``` ### Show n number of instructions ```bash (gdb) x/10i $pc => 0x801a0 : ldr w1, [x2] 0x801a4 : tbnz w1, #30, 0x801a0 0x801a8 : ldr w1, [x3] 0x801ac : cmp w0, w1 0x801b0 : b.ne 0x801a0 // b.any 0x801b4 : ldp x19, x20, [sp, #16] 0x801b8 : ldp x29, x30, [sp], #32 0x801bc : ret 0x801c0 : sub sp, sp, #0x10 0x801c4 : mov w0, #0x3344 // #13124 ``` ### Links 1. [http://althing.cs.dartmouth.edu/secref/resources/plt-got.txt](http://althing.cs.dartmouth.edu/secref/resources/plt-got.txt) 2. [http://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_28.html](http://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_28.html) 3. [http://www.unknownroad.com/rtfm/gdbtut/gdbbreak.html](http://www.unknownroad.com/rtfm/gdbtut/gdbbreak.html)