Show trace of where you are currently. Which functions you are in. Prints stack backtrace.
backtrace full
Print values of local variables.
frame number
f number
Select frame number.
up number
down number
Move up/down the specified number of frames in the stack.
info frame
List address, language, address of arguments/local variables and which registers were saved in frame.
info args
info locals
info catch
Info arguments of selected frame, local variables and exception handlers.
Source Code
list
l
list line-number
list function
list -
list start#,end#
list filename:function
List source code.
set listsize count
show listsize
Number of lines listed when list command given.
directory directory-name
dir directory-name
show directories
Add specified directory to front of source code path.
directory
Clear sourcepath when nothing specified.
Examine Variables
print variable-name
p variable-name
p file-name::variable-name
p 'file-name'::variable-name
Print value stored in variable.
p *array-variable@length
Print first # values of array specified by length. Good for pointers to dynamicaly allocated memory.
p/x variable
Print as integer variable in hex.
p/d variable
Print variable as a signed integer.
p/u variable
Print variable as a un-signed integer.
p/o variable
Print variable as a octal.
p/t variable
x/b address
x/b &variable
Print as integer value in binary. (1 byte/8bits)
p/c variable
Print integer as character.
p/f variable
Print variable as floating point number.
p/a variable
Print as a hex address.
x/w address
x/4b &variable
Print binary representation of 4 bytes (1 32 bit word) of memory pointed to by address.
GDB Modes
set gdb-optionvalue
Set a GDB option
set logging on
set logging off
show logging
set logging file log-file
Turn on/off logging. Default name of file is gdb.txt
set print array on
set print array off
show print array
Default is off. Convient readable format for arrays turned on/off.
set print array-indexes on
set print array-indexes off
show print array-indexes
Default off. Print index of array elements.
set print pretty on
set print pretty off
show print pretty
Format printing of C structures.
set print union on
set print union off
show print union
Default is on. Print C unions.
set print demangle on
set print demangle off
show print demangle
Default on. Controls printing of C++ names.
Start and Stop
run
r
run command-line-arguments
run < infile > outfile
Start program execution from the beginning of the program. The command break main will get you started. Also allows basic I/O redirection.
continue c
Continue execution to next break point.
kill
Stop program execution.
quit
q
Exit GDB debugger.
GDB Operation:
Compile with the "-g" option (for most GNU and Intel compilers) which generates added information in the object code so the debugger can match a line of source code with the step of execution.
Do not use compiler optimization directive such as "-O" or "-O2" which rearrange computing operations to gain speed as this reordering will not match the order of execution in the source code and it may be impossible to follow.
control+c: Stop execution. It can stop program anywhere, in your source or a C library or anywhere.
To execute a shell command: ! command
or shell command
GDB command completion: Use TAB key
info bre + TAB will complete the command resulting in info breakpoints
Press TAB twice to see all available options if more than one option is available or type "M-?" + RETURN.
GDB command abreviation:
info bre + RETURN will work as bre is a valid abreviation for breakpoints
De-Referencing STL Containers:
Displaying STL container classes using the GDB "p variable-name"
results in an cryptic display of template definitions and pointers.
Use the following ~/.gdbinit file (V1.03 09/15/08). Now works with GDB 4.3+.
(Archived versions: [V1.01 GDB 6.4+ only])
Thanks to Dr. Eng. Dan C. Marinescu for permission to post this script.
Use the following commands provided by the script:
Data type
GDB command
std::vector<T>
pvector stl_variable
std::list<T>
plist stl_variable T
std::map<T,T>
pmap stl_variable
std::multimap<T,T>
pmap stl_variable
std::set<T>
pset stl_variable T
std::multiset<T>
pset stl_variable
std::deque<T>
pdequeue stl_variable
std::stack<T>
pstack stl_variable
std::queue<T>
pqueue stl_variable
std::priority_queue<T>
ppqueue stl_variable
std::bitset<n>td>
pbitset stl_variable
std::string
pstring stl_variable
std::widestring
pwstring stl_variable
Where T refers to native C++ data types. While classes and other STL data types will work with the STL container classes, this de-reference tool may not handle non-native types.
(gdb) l
1 #include <iostream>
2 #include <vector>
3 #include <string>
4
5 using namespace std;
6
7 main()
8 {
9 vector<int> II;
10
(gdb) l
11 II.push_back(10);
12 II.push_back(20);
13 II.push_back(30);
14
15 cout << II.size() << endl;
16
17 }
(gdb) break 15
Breakpoint 1 at 0x8048848: file STL_vector_int.cpp, line 15.
(gdb) r
Starting program: /home/userx/a.out
Breakpoint 1, main () at STL_vector_int.cpp:15
15 cout << II.size() << endl;
(gdb) p II
$1 = {
<std::_Vector_base<int,std::allocator<int> >> = {
_M_impl = {
<std::allocator<int>> = {
<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<int,std::allocator<int> >::_Vector_impl:
_M_start = 0x804b028,
_M_finish = 0x804b034,
_M_end_of_storage = 0x804b038
}
}, <No data fields>}
(gdb) pvector II
elem[0]: $2 = 10
elem[1]: $3 = 20
elem[2]: $4 = 30
Vector size = 3
Vector capacity = 4
Element type = int *
(gdb) c
Continuing.
3
Program exited normally.
(gdb) quit
Notice the native GDB print "p" results in an cryptic display while the "pvector"
routine from the GDB script provided a human decipherable display of your data.
(gdb) l
1 #include <iostream>
2 #include <vector>
3
4 using namespace std;
5
6 main()
7 {
8 vector< vector<int> > vI2Matrix(3, vector<int>(2,0));
9
10 vI2Matrix[0][0] = 0;
(gdb) l
11 vI2Matrix[0][1] = 1;
12 vI2Matrix[1][0] = 10;
13 vI2Matrix[1][1] = 11;
14 vI2Matrix[2][0] = 20;
15 vI2Matrix[2][1] = 21;
16
17 cout << "Loop by index:" << endl;
18
19 int ii, jj;
20 for(ii=0; ii < 3; ii++)
(gdb) break 17
Breakpoint 1 at 0x8048a19: file STL_vector_2.cpp, line 17.
(gdb) r
Starting program: /home/userx/a.out
Breakpoint 1, main () at STL_vector_2.cpp:17
17 cout << "Loop by index:" << endl;
(gdb) pvector vI2Matrix
elem[0]: $1 = {
<std::_Vector_base<int,std::allocator<int> >> = {
_M_impl = {
<std::allocator<int>> = {
<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<int,std::allocator<int> >::_Vector_impl:
_M_start = 0x804b040,
_M_finish = 0x804b048,
_M_end_of_storage = 0x804b048
}
}, <No data fields>}
elem[1]: $2 = {
<std::_Vector_base<int,std::allocator<int> >> = {
_M_impl = {
<std::allocator<int>> = {
<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<int,std::allocator<int> >::_Vector_impl:
_M_start = 0x804b050,
_M_finish = 0x804b058,
_M_end_of_storage = 0x804b058
}
}, <No data fields>}
elem[2]: $3 = {
<std::_Vector_base<int,std::allocator<int> >> = {
_M_impl = {
<std::allocator<int>> = {
<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<int,std::allocator<int> >::_Vector_impl:
_M_start = 0x804b060,
_M_finish = 0x804b068,
_M_end_of_storage = 0x804b068
---Type <return> to continue, or q <return> to quit---
}
}, <No data fields>}
Vector size = 3
Vector capacity = 3
Element type = class std::vector<int,std::allocator<int> > *
(gdb) pvector $1
elem[0]: $4 = 0
elem[1]: $5 = 1
Vector size = 2
Vector capacity = 2
Element type = int *
(gdb) pvector $2
elem[0]: $6 = 10
elem[1]: $7 = 11
Vector size = 2
Vector capacity = 2
Element type = int *
(gdb) pvector $3
elem[0]: $8 = 20
elem[1]: $9 = 21
Vector size = 2
Vector capacity = 2
Element type = int *
(gdb) p vI2Matrix
$10 = {
<std::_Vector_base<std::vector<int, std::allocator<int> >,std::allocator<std::vector<int, std::allocator<int> > > >> = {
_M_impl = {
<std::allocator<std::vector<int, std::allocator<int> > >> = {
<__gnu_cxx::new_allocator<std::vector<int, std::allocator<int> > >> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<std::vector<int, std::allocator<int> >,std::allocator<std::vector<int, std::allocator<int> > > >::_Vector_impl:
_M_start = 0x804b018,
_M_finish = 0x804b03c,
_M_end_of_storage = 0x804b03c
}
}, <No data fields>}
(gdb) quit
Note "pvector" does not de-reference the entire vector of vectors all at once but returns vectors $1, $2 and $3. The "pvector" command then helps us traverse the information by examining the contents of each element in the individual "terminal" vectors.
Note that the native gdb "p vI2Matrix" (last command) was much less informative.
"Debugging with GDB: The GNU Source-Level Debugger"
by Richard Stallman, Roland H. Pesch, Stan Shebs
ISBN # 1882114884, Free Software Foundation; 9th edition (January 1, 2002)
"GDB Pocket Reference"
by Arnold Robbins
ISBN # 0596100272, O'Reilly
"Advanced Linux Programming"
by Mark Mitchell, Jeffrey Oldham, Alex Samuel, Jeffery Oldham
ISBN # 0735710430, New Riders
Good book for programmers who already know how to program and just need
to know the Linux specifics. Covers a variety of Linux tools, libraries,
API's and techniques. If you don't know how to program, start with a
book on C.
Dr. Dobb's Journal
Free subscription to the premier resource for
professional programmers and software developers. Multi-language and
multi-platform with program listings, coding tips, design issue
discussions and algorithms. Subscribe here!