Gdb: Difference between revisions

From miki
Jump to navigation Jump to search
Line 9: Line 9:
Reference list:
Reference list:
* [https://sourceware.org/gdb/wiki/GDB%20Front%20Ends GDB Front Ends]
* [https://sourceware.org/gdb/wiki/GDB%20Front%20Ends GDB Front Ends]
* [http://stackoverflow.com/questions/209534/how-to-highlight-and-color-gdb-output-during-interactive-debugging How to highlight and color gdb output during interactive debugging?]


Ideally front-ends must use the GDB/MI2 interface.
Ideally front-ends must use the GDB/MI2 interface.
There is also the built-in Text User Interface to GDB ({{kb|C-x C-a}}: http://davis.lbl.gov/Manuals/GDB/gdb_21.html


=== Good candidates ===
Mainly from SO post above:
* [https://github.com/cyrus-and/gdb-dashboard GDB Dashboard]
* [https://github.com/zachriggle/pwndbg pwndbg]
* [https://github.com/snare/voltron voltron]

Vim:
* https://github.com/vim-scripts/Conque-GDB
* http://pyclewn.sourceforge.net/

Neovim:
* https://github.com/critiqjo/lldb.nvim

=== GDBInit hacks ===
* Using [https://github.com/nojhan/colout/blob/master/colout/example.gdbinit colout] one may color almost any gdb output.

=== Old front-ends ===
These are using the old "annotation" mechanisms:
These are using the old "annotation" mechanisms:
* [http://www.gnu.org/software/ddd/ DDD]
* [http://www.gnu.org/software/ddd/ DDD]
* [http://www.kdbg.org/index.php KDBG]
* [http://www.kdbg.org/index.php KDBG]
* [http://cgdb.github.io/ cgdb] (text mode with vi keymap)
* [http://cgdb.github.io/ cgdb] (text mode with vi keymap)

There is also the built-in Text User Interface to GDB ({{kb|C-x C-a}}: http://davis.lbl.gov/Manuals/GDB/gdb_21.html


== GDB configuratino ==
== GDB configuratino ==

Revision as of 20:57, 23 November 2016

References

GDB front-ends

Reference list:

Ideally front-ends must use the GDB/MI2 interface. There is also the built-in Text User Interface to GDB (C-x C-a: http://davis.lbl.gov/Manuals/GDB/gdb_21.html

Good candidates

Mainly from SO post above:

Vim:

Neovim:

GDBInit hacks

  • Using colout one may color almost any gdb output.

Old front-ends

These are using the old "annotation" mechanisms:

GDB configuratino

GDB reads file ~/.gdbinit at start.

Some references:

Bare minimum configuration

From StackOverflow [1]:

set history save on
set print pretty
set output-radix 16
set height 0

GDB dashboard

GDB dashboard is a modular visual interface for GDB in Python.

To install simply copy .gdbinit as ~/.gdbinit

cp gdb-dashboard/.gdbinit ~/.gdbinit


Alternatively, source it from ~/.gdbinit:

source ~/.gdbinit-dashboard
Install pygments

Install pygments to get source highlighting

sudo pip install Pygments        # Globally
pip install Pygments             # Locally

If GDB uses python3 (ldd $(which gdb))), you'll need to install with pip3:

sudo pip3 install Pygments       # Globally
pip3 install Pygments            # Locally

To get the list of available styles:

python from pygments.styles import get_all_styles as styles
python for s in styles(): print(s)

Alternative styles:

Prepare debug session

  • Compile with debug symbols, use option -g:
gcc -g program.c               # -g : debug symbols
gcc -g -O0 program.c           #  ... -O0: disable optimization
  • Force core dumps (see bash help ulimit):
ulimit -c unlimited
./a.out
# Segmentation fault (core dumped)

GDB invocation

gdb a.out
gdb a.out core.1234           # If coredump available

GDB commands

Reference:

Break points and watch points

b [+-][NUMBER]
break [+-][NUMBER]

Set a breakpoint at current line, at given line NUMBER or NUMBER lines after/before current line.

b LOCATION
break LOCATION

Set breakpoint at LOCATION.
b main sets a breakpoint at beginning of function main().
b foo.c:42 sets a breakpoint at file foo.c, line 42.

watch EXPR

Stop execution when EXPR changes

awatch EXPR

Stop execution when EXPR is accessed

i b
info b
info break

list breakpoints

cl LOCATION
clear LOCATION

Clear breakpoint by LOCATION

d
delete

Delete all breakpoints

d NUMBER
delete NUMBER

Clear breakpoint by NUMBER (as listed by i b)

dis NUMBER
disable NUMBER

Disable breakpoint by NUMBER (as listed by i b)

save b FILE
save breakpoints FILE

Save current breakpoints as script FILE. Use source to reload.
Execute program

r [ARGS]
run [ARGS]

Start (or restart) program. Arguments may include wildcards (*) and redirections (<, <<...)

kill

Kill current program.

c
cont

Continue and interrupted program.

s [NUMBER]
step [NUMBER]

Step (into) current line, or NUMBER lines.

n
next

Run to next line (over current line)

fin
finish

Execute till returning from current selected frame.

advance LOCATION

Run until temporary breakpoint set at LOCATION.

until [NUMBER]

Execute until the program reaches a source line greater than current.
View stack

bt
bt [COUNT]
backtrace [COUNT]
where [COUNT]

Print backtrace of all stack frames, or innermost (outermost) COUNT frames if COUNT>0 (COUNT<0)

f [FRAME]
frame [FRAME]

Select frame FRAME and print stack frame

up

Go up a level in the stack (frame calling current frame).

do
down

Go down a level in the stack (frame called by current frame).
View memory

disp EXPR
display EXPR

Display EXPR at each prompt (if within scope).

i locals
i args
info locals
info args

Print information on local variables / function arguments in the current frame

print EXPR

print EXPR.

undisplay NUMBER

Undisplay expression by NUMBER.
View code

l
list

List (10 by default) lines of current frame

disassemble /m
disassemble /s
disassemble 'foo.c'::bar

Disassemble a specified section of memory
Miscellaneous

q
quit

Quit gdb.

help COMMAND
apropos WORD

Get help on COMMAND, or search commands related to WORD.

source FILE

Source script FILE.
RETURN Repeat last command.

Tips

Define a custom label for breakpoint in C/C++

Say we want to set a breakpoint at a specified location in source file, but this position may move over time. The easiest is to use an asm statement to define the label [2]:

#include <stdio.h>

int main () {
  void *ret_p = &&ret;
  printf("ret: %p\n", ret_p);
  goto *ret_p;

  return 1;

ret:
  asm("RET:")

    return 0;
}

This will add a symbol table entry as follows.

gcc  -Wl,--export-dynamic t.c  -ldl
readelf -s a.out | grep RET
# 41: 0804858a     0 NOTYPE  LOCAL  DEFAULT   13 RET

Examples

Simple Segmentation Fault Example

(From [3])

Example program segfault.c:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  char *buf;

  buf = malloc(1<<31);

  fgets(buf, 1024, stdin);
  printf("%s\n", buf);

  return 1;
}
Compile and launch gdb:
gcc -g segfault.c
gdb a.out

The debug session

run
backtrace
frame 3
print buf
kill
break segfault.c:8
run
print buf
next
print buf

Fix the bug, then start again, watching now buf:

watch buf
# Start again, answer 'y' when asked to start from beginning
run
# Break at watch point, let's _c_ontinue
c