summaryrefslogtreecommitdiffstats
path: root/docs/re/gdb.txt
blob: 577281516c77a87c7c6b6f986cb0f22e1a6c05e0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
GNU Debugger (gdb) Basic Cheat Sheet
====================================

If possible, compile program with '-ggdb' to enable GDB-specific debugging
symbols.


Getting started
---------------
Launch GDB:
    > gdb <executable> # note: any arguments to the exe are supplied separately
    > gdb -p <process id> # attach to an already running process (requires root)

    (gdb) run <argument0> <argument1> ... # Start running program

Quit GDB:
    (gdb) quit
    (gdb) q


Breakpoints
-----------
Set a breakpoint:
    (gdb) break <function>
    (gdb) break <function><+offset>
    (gdb) break <address>
    (gdb) b <arg>

List breakpoints:
    (gdb) info break
    (gdb) i b

Remove breakpoint:
    (gdb) delete <id>
    (gdb) d <id>
    (gdb) d # deletes all breakpoints


Debugging
---------
Inspect registers:
    (gdb) info registers
    (gdb) i r

Get call stack / backtrace:
    (gdb) backtrace
    (gdb) bt

Single-step program:
    (gdb) display/i $pc # If debugging symbols missing, set prompt to display
                          current instruction disassembly
    (gdb) n # next source code statement
    (gdb) s # step source code statement (will follow calls)
    (gdb) ni # next machine instruction
    (gdb) si # step machine instruction (will follow calls)

    (gdb) continue # resume execution (until next breakpoint)
    (gdb) c

    (gdb) finish # resume execution (until ret - step out of function)
    (gdb) fin

Disassemble program:
    (gdb) disassemble <function>
    (gdb) disassemble <address>
    (gdb) disas <arg>


Memory
------
Examine memory:
    (gdb) x/nfu <address> # List contents of memory starting at <address>
                            and interpret data according to n, f, u

        'n' is a repeat count: Specifies how many values to display
        'f' is the display format: one of
            x, d, u, o, t, a, c, f, s, i, m
        'u' is the unit size: one of
            b, h, w, g

    Example:
        (gdb) x/32xg $sp # Display the first 32 64-bit 'giant' words on the
                           stack

Alter memory:
    (gdb) set {type}<address> = <value>

    Example:
        (gdb) set {int}0x7fffffdead = 69 # Write the value 69 to given address
                                           as a 32-bit integer


Process forks
-------------
    (gdb) set follow-fork-mode <parent|child> # Define debugging behavior on
                                                fork()
    (gdb) set detach-on-fork <on|off> # If set to 'off' gdb will keep a debugger
                                        on both processes - Default is on

    (gdb) show follow-fork-mode # Check config
    (gdb) show detach-on-fork # Check config