Starting GDB:

  • gdbname-of-executable
  • gdb -ename-of-executable-cname-of-core-file
  • gdbname-of-executable-pidprocess-id
    (Use ps -auxw

Command line options: (version 6. Older versions use a single "-")


Option

Description

--help

-h

List command line arguments

--exec=file-name

-e file-name

Identify executable associated with core file.

--core=name-of-core-file

-c name-of-core-file

Specify core file.

--command=command-file

-x command-file

File listing GDB commands to perform. Good for automating set-up.

--directory=directory

-d directory

Add directory to the path to search for source files.

--cd=directory

Run GDB using specified directory as the current working directory.

--nx

-n

Do not execute commands from ~/.gdbinit

--batch -x command-file

Run in batch (not interactive) mode. Execute commands from file. Requires -x

--symbols=file-name

-s file-name

Read symbol table from file file.

--write

Enable writing into executable and core files.

--quiet

-q

Do not print the introductory and copyright messages.

--tty=device

Specify device for running program's standard input and output.

--pid=process-id

-p process-id

-c process-id

Specify process ID number to attach to.


 


GDB Commands:

Commands used within GDB:

 


Command

Description

help

List gdb command topics.

help topic-classes

List gdb command within class.

help command

Command description.

apropos search-word

Search for commands and command topics containing search-word.

info args

i args

List program command line arguments

info breakpoints

List breakpoints

info break

List breakpoint numbers.

info break breakpoint-number

List info about specific breakpoint.

info watchpoints

List breakpoints

info registers

List registers in use

info threads

List threads in use

info set

List set-able option

Break and Watch


break funtion-name

break line-number

Suspend program at specified function of line number.

break ClassName::functionName

break +offset

break -offset

Set a breakpoint specified number of lines forward or back from the position at which execution stopped.

break filename:function

Don't specify path, just the file name and function name.

break filename:line-number

Don't specify path, just the file name and line number.

break Directory/Path/filename.cpp:62

break *address

Suspend processing at an instruction address. Used when you do not have source.

break line-number if condition

Where condition is an expression. i.e. x > 5

Suspend when boolean expression is true.

break line thread thread-number

Break in thread at specified line number. Use info threads

tbreak

Temporary break. Break once only. Break is then removed. See "break" above for options.

watch condition

Suspend processing when condition is met. i.e. x > 5

clear

clear function

clear line-number

Delete breakpoints as identified by command option.

delete

d

Delete all breakpoints, watchpoints, or catchpoints.

delete breakpoint-number

delete range

Delete the breakpoints, watchpoints, or catchpoints of the breakpoint ranges specified as arguments.

disable breakpoint-number-or-range

enable breakpoint-number-or-range

Does not delete breakpoints. Just enables/disables them.

Example:

Show breakpoints: info break

Disable: disable 2-9

enable breakpoint-number once

Enables once

continue

c

Continue executing until next break point/watchpoint.

continue number

Continue but ignore current breakpoint number times. Usefull for breakpoints within a loop.

finish

Continue to end of function.

Line Execution


step

s

step number-of-steps-to-perform

Step to next line of code. Will step into a function.

next

n

next number

Execute next line of code. Will not enter functions.

until

until line-number

Continue processing until you reacha aspecified line number. Also: function name, address, filename:function or filename:line-number.

stepi

si

nexti

ni

step/next assembly/processor instruction.

info signals

info handle

handle SIGNAL-NAMEoption

Perform the following option when signal recieved: nostop, stop, print, noprint, pass/noignore or nopass/ignore

where

Shows current line number and which function you are in.

Stack


backtrace

bt

bt inner-function-nesting-depth

bt -outer-function-nesting-depth

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

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 shellcommand
  • 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

 

Also see the ​​YoLinux.com STL string class tutorial and debugging with GDB​​.


De-Referencing a vector:

Example: STL_vector_int.cpp




​view source​



​print​

​?​


























​01​

​#include <iostream> ​

Compile:

g++ -g STL_vector_int.cpp

Debug in GDB: gdb a.out


(

(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

 


De-Referencing a 2-D vector of vectors:

Example: STL_vector_int_2.cpp




​view source​



​print​

​?​




































​01​

​#include <iostream> ​

Compile:

g++ -g STL_vector_int_2.cpp

Debug in GDB: gdb a.out


​(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