Gdb notes
From raju
tips
stack specific breakpoints in gdb
break if variable equals string
(gdb) b prog.c:1474 if strcmp(a.c_str(), "kamaraju") == 0
If the breakpoint is already set, use condition command. For example
(gdb) condi 3 a.compare("kamarju") == 0
will set the condition on the 3rd breakpoint.
tag | conditional breakpoint
Run commands when a breakpoint is hit
(gdb) help commands Set commands to be executed when a breakpoint is hit. Give breakpoint number as argument after "commands". With no argument, the targeted breakpoint is the last one set. The commands themselves follow starting on the next line. Type a line containing "end" to indicate the end of them. Give "silent" as the first line to make the breakpoint silent; then no output is printed when it is hit, except what the commands print. (gdb) i b (gdb) commands 3 Type commands for breakpoint(s) 3, one per line. End with a line saying just "end". >bt >p myVar >end (gdb) commands 18 Type commands for breakpoint(s) 18, one per line. End with a line saying just "end". >silent >printf "%s\n",id.c_str() >cont >end
start gdb and load commands from a file
Sample command file
% cat cmd.gdb b MathFunctions.C:20 b sqrt b cube set args -x 5.1 -y 3.2 r
Sample run
gdb -q executable -x cmd.gdb
The -x option is documented in "gdb --help", but it is a bit hard to see at first glance.
% gdb --help | grep "\-x\>" --command=FILE, -x Execute GDB commands from FILE.
If gdb is already running, use source to run the commands in a file
(gdb) source cmd.gdb
See also: https://www.sourceware.org/gdb/current/onlinedocs/gdb/Command-Files.html#Command-Files
Which file am I currently debugging?
info files
What is the gdb version I am running?
show version
Things to remember in the TUI mode
- Switch cursor focus between SRC and CMD windows: ctrl-x o
- Toggle the TUI mode: ctrl-x a
- increase the window height
Get the name of window
(gdb) info win SRC (39 lines) <has focus> CMD (19 lines)
Decrease the window height by 5 lines
(gdb) winheight SRC -5
Ref:
- https://sourceware.org/gdb/onlinedocs/gdb/TUI-Keys.html
- https://sourceware.org/gdb/onlinedocs/gdb/TUI-Commands.html
print enum variables in gdb
This tip shows various ways of printing the values of enum variables in a gdb session. Consider
% cat print_enum.c enum E { Val1, Val2 }; int main() { enum E e = Val1; return e; }
compile using
% g++ -g print_enum.c
Debug
% gdb ./a.out Reading symbols from ./a.out...done. (gdb) b 7 Breakpoint 1 at 0x400558: file print_enum.c, line 7. (gdb) r Breakpoint 1, main () at print_enum.c:7 7 enum E e = Val1; (gdb) n 8 return e;
Let's try printing the variables
(gdb) p e $2 = Val1
This is fine but printing Val1 does not give any useful information.
(gdb) p Val1 $1 = Val1
To print the underlying value, we can do one of the following
(gdb) p (int) Val1 $4 = 0 (gdb) p /d Val1 $5 = 0 (gdb) p Val1+0 $6 = 0
First print it and then use the "up arrow" key
(gdb) p Val1 $7 = Val1 (gdb) <UP>+0 $8 = 0
Omit the variable name, since the expression defaults to $.
(gdb) p Val1 $9 = Val1 (gdb) p /d $10 = 0
Ref:
- https://sourceware.org/bugzilla/show_bug.cgi?id=11067
color prompt
- See http://www.fayewilliams.com/2013/09/07/gdb-prompt-in-colour/ for help on setting a color prompt
- See http://ascii-table.com/ansi-escape-sequences.php for the list of available colors
gdb issues
https://sourceware.org/bugzilla/show_bug.cgi?id=12446
This issue is not present in Debian box running
$ gdb --version
GNU gdb (GDB) 7.6.2 (Debian 7.6.2-1)
$ g++ --version
g++ (Debian 4.9.0-7) 4.9.0
Tested it with
$ g++ -g -o foo foo.cpp
Afterwards test it on the Redhat machine.
set breakpoints using regex
Use rbreak as described in the gdb manual. For example, to set breakpoints in all the functions of a class, use
rbreak ^MyClassFoo::
To be sorted
TUI shortcomings
- It is not possible to scroll back in the CMD window. So if there is lot of output, it is all lost. A work around is to use emacs gdb interface which allows scrolling back.
Ref:
useful links
- GDB front ends and other tools - https://sourceware.org/gdb/wiki/GDB%20Front%20Ends