Gdb: Difference between revisions
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. |
||
⚫ | |||
=== 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) |
||
⚫ | |||
== GDB configuratino == |
== GDB configuratino == |
Revision as of 20:57, 23 November 2016
References
- 7.2 Example Debugging Session: Segmentation Fault Example (unkownroad.com)
- Debugging with GDB (delorie.com)
- GDB commands (tutorialspoint.com)
- An Interactive Guide to Faster, Less Frustrating Debugging
- Norm Matloff's Debugging Tutorial (also guide to fast editing and gui debuggers DDD, GVD)
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:
- GDB manual
- https://beej.us/guide/bggdb/
Break points and watch points | |
---|---|
|
Set a breakpoint at current line, at given line NUMBER or NUMBER lines after/before current line. |
|
Set breakpoint at LOCATION.
|
|
Stop execution when EXPR changes |
|
Stop execution when EXPR is accessed |
|
list breakpoints |
|
Clear breakpoint by LOCATION |
|
Delete all breakpoints |
|
Clear breakpoint by NUMBER (as listed by i b )
|
|
Disable breakpoint by NUMBER (as listed by i b )
|
|
Save current breakpoints as script FILE. Use source to reload.
|
Execute program | |
---|---|
|
Start (or restart) program. Arguments may include wildcards (*) and redirections (<, <<...) |
|
Kill current program. |
|
Continue and interrupted program. |
|
Step (into) current line, or NUMBER lines. |
|
Run to next line (over current line) |
|
Execute till returning from current selected frame. |
|
Run until temporary breakpoint set at LOCATION. |
|
Execute until the program reaches a source line greater than current. |
View stack | |
---|---|
|
Print backtrace of all stack frames, or innermost (outermost) COUNT frames if COUNT>0 (COUNT<0) |
|
Select frame FRAME and print stack frame |
|
Go up a level in the stack (frame calling current frame). |
|
Go down a level in the stack (frame called by current frame). |
View memory | |
---|---|
|
Display EXPR at each prompt (if within scope). |
|
Print information on local variables / function arguments in the current frame |
|
print EXPR. |
|
Undisplay expression by NUMBER. |
View code | |
---|---|
|
List (10 by default) lines of current frame |
|
Disassemble a specified section of memory |
Miscellaneous | |
---|---|
|
Quit gdb. |
|
Get help on COMMAND, or search commands related to WORD. |
|
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 watch buf
# Start again, answer 'y' when asked to start from beginning
run
# Break at watch point, let's _c_ontinue
c
|