[Top] | [Contents] | [Index] | [ ? ] |
This file describes GDB, the GNU symbolic debugger.
This is the HP Ninth Edition, June 2000, for GDB Version 19991101.
Copyright (C) 1988-2000 Free Software Foundation, Inc.
Summary Summary of GDB Sample Session A sample GDB session Invocation Getting in and out of GDB Commands GDB commands Running Running programs under GDB Stopping Stopping and continuing Stack Examining the stack Source Examining source files Data Examining data Languages Using GDB with different languages Symbols Examining the symbol table Altering Altering execution GDB Files GDB files Targets Specifying a debugging target HP-UX Configuration HP Configuration-specific information Terminal User Interface Screen-based interface to HP WDB 2.0 XDB to WDB Transition Guide Aid for XDB users who are learning HP WDB 2.0 Controlling GDB Controlling GDB Sequences Canned sequences of commands Emacs Using GDB under GNU Emacs GDB Bugs Reporting bugs in GDB Command Line Editing Command Line Editing Using History Interactively Using History Interactively Installing GDB Installing GDB Index Index
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The purpose of a debugger such as GDB is to allow you to see what is going on "inside" another program while it executes--or what another program was doing at the moment it crashed.
GDB can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:
Support for Modula-2 and Chill is partial. For information on Modula-2, see Modula-2. For information on Chill, see Chill.
Debugging Pascal programs which use sets, subranges, file variables, or nested functions does not currently work. GDB does not support entering expressions, printing values, or similar features using Pascal syntax.
GDB can be used to debug programs written in Fortran, although it may be necessary to refer to some variables with a trailing underscore. See Fortran.
This version of the manual documents HP WDB 2.0, implemented on HP 9000 systems running Release 10.20, or 11.0 of the HP-UX operating system. HP WDB 2.0 can be used to debug code generated by the HP ANSI C, HP ANSI C++ and HP Fortran compilers as well as the GNU C and C++ compilers. It does not support the debugging of Modula-2 or Chill programs.
Free Software Freely redistributable software Contributors Contributors to GDB
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB is free software, protected by the GNU General Public License (GPL). The GPL gives you the freedom to copy or adapt a licensed program--but every person getting a copy also gets with it the freedom to modify that copy (which means that they must get access to the source code), and the freedom to distribute further copies. Typical software companies use copyrights to limit your freedoms; the Free Software Foundation uses the GPL to preserve these freedoms.
Fundamentally, the General Public License is a license which says that you have these freedoms and that you cannot take these freedoms away from anyone else.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Richard Stallman was the original author of GDB, and of many other GNU programs. Many others have contributed to its development. This section attempts to credit major contributors. One of the virtues of free software is that everyone is free to contribute to it; with regret, we cannot actually acknowledge everyone here. The file `ChangeLog' in the GDB distribution approximates a blow-by-blow account.
Changes much prior to version 2.0 are lost in the mists of time.
Plea: Additions to this section are particularly welcome. If you or your friends (or enemies, to be evenhanded) have been unfairly omitted from this list, we would like to add your names!So that they may not regard their many labors as thankless, we particularly thank those who shepherded GDB through major releases: Jim Blandy (release 4.18); Jason Molenda (release 4.17); Stan Shebs (release 4.14); Fred Fish (releases 4.16, 4.15, 4.13, 4.12, 4.11, 4.10, and 4.9); Stu Grossman and John Gilmore (releases 4.8, 4.7, 4.6, 4.5, and 4.4); John Gilmore (releases 4.3, 4.2, 4.1, 4.0, and 3.9); Jim Kingdon (releases 3.5, 3.4, and 3.3); and Randy Smith (releases 3.2, 3.1, and 3.0).
Richard Stallman, assisted at various times by Peter TerMaat, Chris Hanson, and Richard Mlynarik, handled releases through 2.8.
Michael Tiemann is the author of most of the GNU C++ support in GDB, with significant additional contributions from Per Bothner. James Clark wrote the GNU C++ demangler. Early work on C++ was by Peter TerMaat (who also did much general update work leading to release 3.0).
GDB 4 uses the BFD subroutine library to examine multiple object-file formats; BFD was a joint project of David V. Henkel-Wallace, Rich Pixley, Steve Chamberlain, and John Gilmore.
David Johnson wrote the original COFF support; Pace Willison did the original support for encapsulated COFF.
Brent Benson of Harris Computer Systems contributed DWARF 2 support.
Adam de Boor and Bradley Davis contributed the ISI Optimum V support. Per Bothner, Noboyuki Hikichi, and Alessandro Forin contributed MIPS support. Jean-Daniel Fekete contributed Sun 386i support. Chris Hanson improved the HP9000 support. Noboyuki Hikichi and Tomoyuki Hasei contributed Sony/News OS 3 support. David Johnson contributed Encore Umax support. Jyrki Kuoppala contributed Altos 3068 support. Jeff Law contributed HP PA and SOM support. Keith Packard contributed NS32K support. Doug Rabson contributed Acorn Risc Machine support. Bob Rusk contributed Harris Nighthawk CX-UX support. Chris Smith contributed Convex support (and Fortran debugging). Jonathan Stone contributed Pyramid support. Michael Tiemann contributed SPARC support. Tim Tucker contributed support for the Gould NP1 and Gould Powernode. Pace Willison contributed Intel 386 support. Jay Vosburgh contributed Symmetry support.
Andreas Schwab contributed M68K Linux support.
Rich Schaefer and Peter Schauer helped with support of SunOS shared libraries.
Jay Fenlason and Roland McGrath ensured that GDB and GAS agree about several machine instruction sets.
Patrick Duval, Ted Goldstein, Vikram Koka and Glenn Engel helped develop remote debugging. Intel Corporation, Wind River Systems, AMD, and ARM contributed remote debugging modules for the i960, VxWorks, A29K UDI, and RDI targets, respectively.
Brian Fox is the author of the readline libraries providing command-line editing and command history.
Andrew Beers of SUNY Buffalo wrote the language-switching code, the Modula-2 support, and contributed the Languages chapter of this manual.
Fred Fish wrote most of the support for Unix System Vr4. He also enhanced the command-completion support to cover C++ overloaded symbols.
Hitachi America, Ltd. sponsored the support for H8/300, H8/500, and Super-H processors.
NEC sponsored the support for the v850, Vr4xxx, and Vr5xxx processors.
Mitsubishi sponsored the support for D10V, D30V, and M32R/D processors.
Toshiba sponsored the support for the TX39 Mips processor.
Matsushita sponsored the support for the MN10200 and MN10300 processors.
Fujitsu sponsored the support for SPARClite and FR30 processors
Kung Hsu, Jeff Law, and Rick Sladkey added support for hardware watchpoints.
Michael Snyder added support for tracepoints.
Stu Grossman wrote gdbserver.
Jim Kingdon, Peter Schauer, Ian Taylor, and Stu Grossman made nearly innumerable bug fixes and cleanups throughout GDB.
The following people at the Hewlett-Packard Company contributed support for the PA-RISC 2.0 architecture, HP-UX 10.20, 10.30, and 11.0 (narrow mode), HP's implementation of kernel threads, HP's aC++ compiler, and the terminal user interface: Ben Krepp, Richard Title, John Bishop, Susan Macchia, Kathy Mann, Satish Pai, India Paul, Steve Rehrauer, and Elena Zannoni. Kim Haase and Rosario de la Torre provided HP-specific information in this manual.
Cygnus Solutions has sponsored GDB maintenance and much of its development since 1991. Cygnus engineers who have worked on GDB fulltime include Mark Alexander, Jim Blandy, Per Bothner, Kevin Buettner, Edith Epstein, Chris Faylor, Fred Fish, Martin Hunt, Jim Ingham, John Gilmore, Stu Grossman, Kung Hsu, Jim Kingdon, John Metzler, Fernando Nasser, Geoffrey Noer, Dawn Perchik, Rich Pixley, Zdenek Radouch, Keith Seitz, Stan Shebs, David Taylor, and Elena Zannoni. In addition, Dave Brolley, Ian Carmichael, Steve Chamberlain, Nick Clifton, JT Conklin, Stan Cox, DJ Delorie, Ulrich Drepper, Frank Eigler, Doug Evans, Sean Fagan, David Henkel-Wallace, Richard Henderson, Jeff Holcomb, Jeff Law, Jim Lemke, Tom Lord, Bob Manson, Michael Meissner, Jason Merrill, Catherine Moore, Drew Moseley, Ken Raeburn, Gavin Romig-Koch, Rob Savoye, Jamie Smith, Mike Stump, Ian Taylor, Angela Thomas, Michael Tiemann, Tom Tromey, Ron Unrau, Jim Wilson, and David Zuhn have made contributions both large and small.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use this manual at your leisure to read all about GDB. However, a handful of commands are enough to get started using the debugger. This chapter illustrates those commands.
One of the preliminary versions of GNU m4
(a generic macro
processor) exhibits the following bug: sometimes, when we change its
quote strings from the default, the commands used to capture one macro
definition within another stop working. In the following short m4
session, we define a macro foo
which expands to 0000
; we
then use the m4
built-in defn
to define bar
as the
same thing. However, when we change the open quote string to
<QUOTE>
and the close quote string to <UNQUOTE>
, the same
procedure fails to define a new synonym baz
:
$ cd gnu/m4
$ ./m4
define(foo,0000)
foo
0000
define(bar,defn(`foo'))
bar
0000
changequote(<QUOTE>,<UNQUOTE>)
define(baz,defn(<QUOTE>foo<UNQUOTE>))
baz
C-d
m4: End of input: 0: fatal error: EOF in string
Let us use GDB to try to see what is going on.
$ gdb m4
Copyright 1986 - 2000 Free Software Foundation, Inc.
Hewlett-Packard Wildebeest 2.0 (based on GDB 4.17-hpwdb-980821)
Wildebeest is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it under
certain conditions. Type "show copying" to see the conditions.
There is absolutely no warranty for Wildebeest.
Type "show warranty" for details.
Wildebeest was built for PA-RISC 1.1 or 2.0 (narrow), HP-UX 11.00.
GDB reads only enough symbol data to know where to find the
rest when needed; as a result, the first prompt comes up very quickly.
We now tell GDB to use a narrower display width than usual, so
that examples fit in this manual.
(gdb) set width 70
We need to see how the m4
built-in changequote
works.
Having looked at the source, we know the relevant subroutine is
m4_changequote
, so we set a breakpoint there with the GDB
break
command.
(gdb) break m4_changequote
Breakpoint 1 at 0x62f4: file builtin.c, line 879.
Using the run
command, we start m4
running under GDB
control; as long as control does not reach the m4_changequote
subroutine, the program runs as usual:
(gdb) run
Starting program: /work/Editorial/gdb/gnu/m4/m4
define(foo,0000)
foo
0000
To trigger the breakpoint, we call changequote
. GDB
suspends execution of m4
, displaying information about the
context where it stops.
changequote(<QUOTE>,<UNQUOTE>)
Breakpoint 1, m4_changequote (argc=3, argv=0x33c70)
at builtin.c:879
879 if (bad_argc(TOKEN_DATA_TEXT(argv[0]),argc,1,3))
Now we use the command n
(next
) to advance execution to
the next line of the current function.
(gdb) n
882 set_quotes((argc >= 2) ? TOKEN_DATA_TEXT(argv[1])\
: nil,
set_quotes
looks like a promising subroutine. We can go into it
by using the command s
(step
) instead of next
.
step
goes to the next line to be executed in any
subroutine, so it steps into set_quotes
.
(gdb) s
set_quotes (lq=0x34c78 "<QUOTE>", rq=0x34c88 "<UNQUOTE>")
at input.c:530
530 if (lquote != def_lquote)
The display that shows the subroutine where m4
is now
suspended (and its arguments) is called a stack frame display. It
shows a summary of the stack. We can use the backtrace
command (which can also be spelled bt
), to see where we are
in the stack as a whole: the backtrace
command displays a
stack frame for each active subroutine.
(gdb) bt
#0 set_quotes (lq=0x34c78 "<QUOTE>", rq=0x34c88 "<UNQUOTE>")
at input.c:530
#1 0x6344 in m4_changequote (argc=3, argv=0x33c70)
at builtin.c:882
#2 0x8174 in expand_macro (sym=0x33320) at macro.c:242
#3 0x7a88 in expand_token (obs=0x0, t=209696, td=0xf7fffa30)
at macro.c:71
#4 0x79dc in expand_input () at macro.c:40
#5 0x2930 in main (argc=0, argv=0xf7fffb20) at m4.c:195
We step through a few more lines to see what happens. The first two
times, we can use `s'; the next two times we use n
to avoid
falling into the xstrdup
subroutine.
(gdb) s
0x3b5c 532 if (rquote != def_rquote)
(gdb) s
0x3b80 535 lquote = (lq == nil || *lq == '\0') ? \
def_lquote : xstrdup(lq);
(gdb) n
536 rquote = (rq == nil || *rq == '\0') ? def_rquote\
: xstrdup(rq);
(gdb) n
538 len_lquote = strlen(rquote);
The last line displayed looks a little odd; we can examine the variables
lquote
and rquote
to see if they are in fact the new left
and right quotes we specified. We use the command p
(print
) to see their values.
(gdb) p lquote
$1 = 0x35d40 "<QUOTE>"
(gdb) p rquote
$2 = 0x35d50 "<UNQUOTE>"
lquote
and rquote
are indeed the new left and right quotes.
To look at some context, we can display ten lines of source
surrounding the current line with the l
(list
) command.
(gdb) l
533 xfree(rquote);
534
535 lquote = (lq == nil || *lq == '\0') ? def_lquote\
: xstrdup (lq);
536 rquote = (rq == nil || *rq == '\0') ? def_rquote\
: xstrdup (rq);
537
538 len_lquote = strlen(rquote);
539 len_rquote = strlen(lquote);
540 }
541
542 void
Let us step past the two lines that set len_lquote
and
len_rquote
, and then examine the values of those variables.
(gdb) n
539 len_rquote = strlen(lquote);
(gdb) n
540 }
(gdb) p len_lquote
$3 = 9
(gdb) p len_rquote
$4 = 7
That certainly looks wrong, assuming len_lquote
and
len_rquote
are meant to be the lengths of lquote
and
rquote
respectively. We can set them to better values using
the p
command, since it can print the value of
any expression--and that expression can include subroutine calls and
assignments.
(gdb) p len_lquote=strlen(lquote)
$5 = 7
(gdb) p len_rquote=strlen(rquote)
$6 = 9
Is that enough to fix the problem of using the new quotes with the
m4
built-in defn
? We can allow m4
to continue
executing with the c
(continue
) command, and then try the
example that caused trouble initially:
(gdb) c
Continuing.
define(baz,defn(<QUOTE>foo<UNQUOTE>))
baz
0000
Success! The new quotes now work just as well as the default ones. The
problem seems to have been just the two typos defining the wrong
lengths. We allow m4
exit by giving it an EOF as input:
C-d
Program exited normally.
The message `Program exited normally.' is from GDB; it
indicates m4
has finished executing. We can end our GDB
session with the GDB quit
command.
(gdb) quit
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter discusses how to start GDB, and how to get out of it. The essentials are:
Invoking GDB How to start GDB Quitting GDB How to quit GDB Shell Commands How to use shell commands inside GDB
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Invoke GDB by running the program gdb
. Once started,
GDB reads commands from the terminal until you tell it to exit.
You can also run gdb
with a variety of arguments and options,
to specify more of your debugging environment at the outset.
The command-line options described here are designed to cover a variety of situations; in some environments, some of these options may effectively be unavailable.
The most usual way to start GDB is with one argument, specifying an executable program:
gdb programYou can also start with both an executable program and a core file specified:
gdb program coreYou can, instead, specify a process ID as a second argument, if you want to debug a running process:
gdb program 1234would attach GDB to process
1234
(unless you also have a file
named `1234'; GDB does check for a core file first).
Taking advantage of the second command-line argument requires a fairly complete operating system; when you use GDB as a remote debugger attached to a bare board, there may not be any notion of "process", and there is often no way to get a core dump. GDB will warn you if it is unable to attach or to read core dumps.
You can run gdb
without printing the front material, which describes
GDB's non-warranty, by specifying -silent
:
gdb -silent
You can further control how GDB starts up by using command-line
options. GDB itself can remind you of the options available.
Type
gdb -helpto display all available options and briefly describe their use (`gdb -h' is a shorter equivalent).
All options and command line arguments you give are processed in sequential order. The order makes a difference when the `-x' option is used.
File Options Choosing files Mode Options Choosing modes Redirecting to a file Redirecting WDB input and output to a file
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When GDB starts, it reads any arguments other than options as specifying an executable file and core file (or process ID). This is the same as if the arguments were specified by the `-se' and `-c' options respectively. (GDB reads the first argument that does not have an associated option flag as equivalent to the `-se' option followed by that argument; and the second argument that does not have an associated option flag, if any, as equivalent to the `-c' option followed by that argument.)
If GDB has not been configured to included core file support, such as for most embedded targets, then it will complain about a second argument and ignore it.
Many options have both long and short forms; both are shown in the following list. GDB also recognizes the long forms if you truncate them, so long as enough of the option is present to be unambiguous. (If you prefer, you can flag option arguments with `--' rather than `-', though we illustrate the more usual convention.)
-symbols file
-s file
-exec file
-e file
-se file
-core file
-c file
-c number
attach
command
(unless there is a file in core-dump format named number, in which
case `-c' specifies that file as a core dump to read).
-command file
-x file
-directory directory
-d directory
-m
-mapped
mmap
system call, you can use this option
to have GDB write the symbols from your
program into a reusable file in the current directory. If the program you are debugging is
called `/tmp/fred', the mapped symbol file is `./fred.syms'.
Future GDB debugging sessions notice the presence of this file,
and can quickly map in symbol information from it, rather than reading
the symbol table from the executable program.
The `.syms' file is specific to the host machine where GDB is run. It holds an exact image of the internal GDB symbol table. It cannot be shared across multiple host platforms.
-r
-readnow
You typically combine the -mapped
and -readnow
options in
order to build a `.syms' file that contains complete symbol
information. (See Files, for information
on `.syms' files.) A simple GDB invocation to do nothing
but build a `.syms' file for future use is:
gdb -batch -nx -mapped -readnow programname
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can run GDB in various alternative modes--for example, in batch mode or quiet mode.
-nx
-n
-quiet
-q
-batch
0
after processing all the
command files specified with `-x' (and all commands from
initialization files, if not inhibited with `-n'). Exit with
nonzero status if an error occurs in executing the GDB commands
in the command files.
Batch mode may be useful for running GDB as a filter, for example to download and run a program on another computer; in order to make this more useful, the message
Program exited normally.(which is ordinarily issued whenever a program running under GDB control terminates) is not issued when running in batch mode.
-nowindows
-nw
-windows
-w
-cd directory
-dbx
dbx
commands, including:
use
status
(in dbx
mode status has a different meaning than in
default GDB mode.
whereis
func
file
assign
call
stop
-fullname
-f
-baud bps
-b bps
-tty device
-tui
/opt/langtools/wdb/doc
on HP-UX systems. Do not use
this option if you run GDB from Emacs (see see Emacs).
-xdb
/opt/langtools/wdb/doc
on HP-UX
systems.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To redirect HP WDB 2.0 input and output to a file use either of these commands to start the debugger:
$ script log1 $ gdbor
$ gdb | tee log1
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
quit
quit
command (abbreviated q
), or
type an end-of-file character (usually C-d). If you do not supply
expression, GDB will terminate normally; otherwise it will
terminate using the result of expression as the error code.
An interrupt (often C-c) does not exit from GDB, but rather terminates the action of any GDB command that is in progress and returns to GDB command level. It is safe to type the interrupt character at any time because GDB does not allow it to take effect until a time when it is safe.
If you have been using GDB to control an attached process or
device, you can release it with the detach
command
(see Attach).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you need to execute occasional shell commands during your
debugging session, there is no need to leave or suspend GDB; you can
just use the shell
command.
shell command string
SHELL
determines which
shell to run. Otherwise GDB uses the default shell
(`/bin/sh' on Unix systems, `COMMAND.COM' on MS-DOS, etc.).
The utility make
is often needed in development environments.
You do not have to use the shell
command for this purpose in
GDB:
make make-args
make
program with the specified
arguments. This is equivalent to `shell make make-args'.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can abbreviate a GDB command to the first few letters of the command name, if that abbreviation is unambiguous; and you can repeat certain GDB commands by typing just RET. You can also use the TAB key to get GDB to fill out the rest of a word in a command (or to show you the alternatives available, if there is more than one possibility).
Command Syntax How to give commands to GDB Completion Command completion Help How to ask GDB for help
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A GDB command is a single line of input. There is no limit on
how long it can be. It starts with a command name, which is followed by
arguments whose meaning depends on the command name. For example, the
command step
accepts an argument which is the number of times to
step, as in `step 5'. You can also use the step
command
with no arguments. Some command names do not allow any arguments.
GDB command names may always be truncated if that abbreviation is
unambiguous. Other possible command abbreviations are listed in the
documentation for individual commands. In some cases, even ambiguous
abbreviations are allowed; for example, s
is specially defined as
equivalent to step
even though there are other commands whose
names start with s
. You can test abbreviations by using them as
arguments to the help
command.
A blank line as input to GDB (typing just RET) means to
repeat the previous command. Certain commands (for example, run
)
will not repeat this way; these are commands whose unintentional
repetition might cause trouble and which you are unlikely to want to
repeat.
The list
and x
commands, when you repeat them with
RET, construct new arguments rather than repeating
exactly as typed. This permits easy scanning of source or memory.
GDB can also use RET in another way: to partition lengthy
output, in a way similar to the common utility more
(see Screen Size). Since it is easy to press one
RET too many in this situation, GDB disables command
repetition after any command that generates this sort of display.
Any text from a # to the end of the line is a comment; it does nothing. This is useful mainly in command files (see Command Files).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB can fill in the rest of a word in a command for you, if there is only one possibility; it can also show you what the valid possibilities are for the next word in a command, at any time. This works for GDB commands, GDB subcommands, and the names of symbols in your program.
Press the TAB key whenever you want GDB to fill out the rest of a word. If there is only one possibility, GDB fills in the word, and waits for you to finish the command (or press RET to enter it). For example, if you type
(gdb) info bre TABGDB fills in the rest of the word `breakpoints', since that is the only
info
subcommand beginning with `bre':
(gdb) info breakpointsYou can either press RET at this point, to run the
info
breakpoints
command, or backspace and enter something else, if
`breakpoints' does not look like the command you expected. (If you
were sure you wanted info breakpoints
in the first place, you
might as well just type RET immediately after `info bre',
to exploit command abbreviations rather than command completion).
If there is more than one possibility for the next word when you press TAB, GDB sounds a bell. You can either supply more characters and try again, or just press TAB a second time; GDB displays all the possible completions for that word. For example, you might want to set a breakpoint on a subroutine whose name begins with `make_', but when you type b make_TAB GDB just sounds the bell. Typing TAB again displays all the function names in your program that begin with those characters, for example:
(gdb) b make_ TAB GDB sounds bell; press TAB again, to see: make_a_section_from_file make_environ make_abs_section make_function_type make_blockvector make_pointer_type make_cleanup make_reference_type make_command make_symbol_completion_list (gdb) b make_After displaying the available possibilities, GDB copies your partial input (`b make_' in the example) so you can finish the command.
If you just want to see the list of alternatives in the first place, you can press M-? rather than pressing TAB twice. M-? means META ?. You can type this either by holding down a key designated as the META shift on your keyboard (if there is one) while typing ?, or as ESC followed by ?.
Sometimes the string you need, while logically a "word", may contain
parentheses or other characters that GDB normally excludes from
its notion of a word. To permit word completion to work in this
situation, you may enclose words in '
(single quote marks) in
GDB commands.
The most likely situation where you might need this is in typing the
name of a C++ function. This is because C++ allows function overloading
(multiple definitions of the same function, distinguished by argument
type). For example, when you want to set a breakpoint you may need to
distinguish whether you mean the version of name
that takes an
int
parameter, name(int)
, or the version that takes a
float
parameter, name(float)
. To use the word-completion
facilities in this situation, type a single quote '
at the
beginning of the function name. This alerts GDB that it may need to
consider more information than usual when you press TAB or
M-? to request word completion:
(gdb) b 'bubble( M-? bubble(double,double) bubble(int,int) (gdb) b 'bubble(In some cases, GDB can tell that completing a name requires using quotes. When this happens, GDB inserts the quote for you (while completing as much as it can) if you do not type the quote in the first place:
(gdb) b bub TAB GDB alters your input line to the following, and rings a bell: (gdb) b 'bubble(In general, GDB can tell that a quote is needed (and inserts it) if you have not yet started typing the argument list when you ask for completion on an overloaded symbol.
For more information about overloaded functions, see C plus plus expressions. You can use the command set
overload-resolution off
to disable overload resolution;
see Debugging C plus plus.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can always ask GDB itself for information on its commands,
using the command help
.
help
h
help
(abbreviated h
) with no arguments to
display a short list of named classes of commands:
(gdb) help
List of classes of commands:
aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands
Type "help" followed by a class name for a list of
commands in that class.
Type "help" followed by command name for full
documentation.
Command name abbreviations are allowed if unambiguous.
(gdb)
help class
status
:
(gdb) help status
Status inquiries.
List of commands:
info -- Generic command for showing things
about the program being debugged
show -- Generic command for showing things
about the debugger
Type "help" followed by command name for full
documentation.
Command name abbreviations are allowed if unambiguous.
(gdb)
help command
help
argument, GDB displays a
short paragraph on how to use that command.
complete args
complete args
command lists all the possible completions
for the beginning of a command. Use args to specify the beginning of the
command you want completed. For example:
complete i
results in:
if
ignore
info
inspect
This is intended for use by GNU Emacs.
In addition to help
, you can use the GDB commands info
and show
to inquire about the state of your program, or the state
of GDB itself. Each command supports many topics of inquiry; this
manual introduces each of them in the appropriate context. The listings
under info
and under show
in the Index point to
all the sub-commands. See Index.
info
i
) is for describing the state of your
program. For example, you can list the arguments given to your program
with info args
, list the registers currently in use with info
registers
, or list the breakpoints you have set with info breakpoints
.
You can get a complete list of the info
sub-commands with
help info
.
set
set
. For example, you can set the GDB prompt to a $-sign with
set prompt $
.
show
info
, show
is for describing the state of
GDB itself.
You can change most of the things you can show
, by using the
related command set
; for example, you can control what number
system is used for displays with set radix
, or simply inquire
which is currently in use with show radix
.
To display all the settable parameters and their current
values, you can use show
with no arguments; you may also use
info set
. Both commands produce the same display.
Here are three miscellaneous show
subcommands, all of which are
exceptional in lacking corresponding set
commands:
show version
show copying
show warranty
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you run a program under GDB, you must first generate debugging information when you compile it.
You may start GDB with its arguments, if any, in an environment of your choice. If you are doing native debugging, you may redirect your program's input and output, debug an already running process, or kill a child process.
Compilation Compiling for debugging Starting Starting your program Arguments Your program's arguments Environment Your program's environment Working Directory Your program's working directory Input/Output Your program's input and output Attach Debugging an already-running process Kill Process Killing the child process Threads Debugging programs with multiple threads Processes Debugging programs with multiple processes
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In order to debug a program effectively, you need to generate debugging information when you compile it. This debugging information is stored in the object file; it describes the data type of each variable or function and the correspondence between source line numbers and addresses in the executable code.
To request debugging information, specify the `-g' option when you run the compiler.
Many C compilers are unable to handle the `-g' and `-O' options together. Using those compilers, you cannot generate optimized executables containing debugging information.
The HP-UX ANSI C and C++ compilers, as well as GCC, the GNU C compiler, supports `-g' with or without `-O', making it possible to debug optimized code. We recommend that you always use `-g' whenever you compile a program. You may think your program is correct, but there is no sense in pushing your luck.
When you debug a program compiled with `-g -O', remember that the optimizer is rearranging your code; the debugger shows you what is really there. Do not be too surprised when the execution path does not exactly match your source file! An extreme example: if you define a variable, but never use it, GDB might not see that variable--because the compiler might optimize it out of existence.
Some things do not work as well with `-g -O' as with just `-g', particularly on machines with instruction scheduling. If in doubt, recompile with `-g' alone, and if this fixes the problem, please report it to us as a bug (including a test case!).
Older versions of the GNU C compiler permitted a variant option `-gg' for debugging information. GDB no longer supports this format; if your GNU C compiler has this option, do not use it.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
run
r
run
command to start your program under GDB.
You must first specify the program name (except on VxWorks) with an
argument to GDB (see Invocation), or by using the file
or exec-file
command
(see Files).
If you are running your program in an execution environment that
supports processes, run
creates an inferior process and makes
that process run your program. (In environments without processes,
run
jumps to the start of your program.)
The execution of a program is affected by certain information it receives from its superior. GDB provides ways to specify this information, which you must do before starting your program. (You can change it after starting your program, but such changes only affect your program the next time you start it.) This information may be divided into four categories:
run
command. If a shell is available on your target, the shell
is used to pass the arguments, so that you may use normal conventions
(such as wildcard expansion or variable substitution) in describing
the arguments.
In Unix systems, you can control which shell is used with the
SHELL
environment variable.
GDB uses the C shell (/usr/bin/csh
).
See Arguments.
set environment
and unset
environment
to change parts of the environment that affect
your program. See Environment.
cd
command in GDB.
See Working Directory.
run
command line, or you can use the tty
command to
set a different device for your program.
See Input/Output.
Warning: While input and output redirection work, you cannot use pipes to pass the output of the program you are debugging to another program; if you attempt this, GDB is likely to wind up debugging the wrong program.
When you issue the run
command, your program begins to execute
immediately. See Stopping, for discussion
of how to arrange for your program to stop. Once your program has
stopped, you may call functions in your program, using the print
or call
commands. See Data.
If the modification time of your symbol file has changed since the last time GDB read its symbols, GDB discards its symbol table, and reads it again. When it does this, GDB tries to retain your current breakpoints.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The arguments to your program can be specified by the arguments of the
run
command.
On HP-UX, they are passed to the C shell (/usr/bin/csh
), which expands wildcard
characters and performs redirection of I/O, and thence to your program.
On non-Unix systems, the program is usually invoked directly by GDB, which emulates I/O redirection via the appropriate system calls, and the wildcard characters are expanded by the startup code of the program, not by the shell.
run
with no arguments uses the same arguments used by the previous
run
, or those set by the set args
command.
set args
set args
has no arguments, run
executes your program
with no arguments. Once you have run your program with arguments,
using set args
before the next run
is the only way to run
it again without arguments.
show args
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The environment consists of a set of environment variables and their values. Environment variables conventionally record such things as your user name, your home directory, your terminal type, and your search path for programs to run. Usually you set up environment variables with the shell and they are inherited by all the other programs you run. When debugging, it can be useful to try running your program with a modified environment without having to start GDB over again.
path directory
PATH
environment variable
(the search path for executables), for both GDB and your program.
You may specify several directory names, separated by white space or by a
system-dependent separator character (`:' on Unix, `;' on
MS-DOS and MS-Windows). If directory is already in the path, it
is moved to the front, so it is searched sooner.
You can use the string `$cwd' to refer to whatever is the current
working directory at the time GDB searches the path. If you
use `.' instead, it refers to the directory where you executed the
path
command. GDB replaces `.' in the
directory argument (with the current path) before adding
directory to the search path.
show paths
PATH
environment variable).
show environment [varname]
environment
as env
.
set environment varname [=value]
For example, this command:
set env USER = footells the debugged program, when subsequently run, that its user is named `foo'. (The spaces around `=' are used for clarity here; they are not actually required.)
unset environment varname
unset environment
removes the variable from the environment,
rather than assigning it an empty value.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each time you start your program with run
, it inherits its
working directory from the current working directory of GDB.
The GDB working directory is initially whatever it inherited
from its parent process (typically the shell), but you can specify a new
working directory in GDB with the cd
command.
The GDB working directory also serves as a default for the commands that specify files for GDB to operate on. See Files.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, the program you run under GDB does input and output to the same terminal that GDB uses. GDB switches the terminal to its own terminal modes to interact with you, but it records the terminal modes your program was using and switches back to them when you continue running your program.
info terminal
You can redirect your program's input and/or output using shell
redirection with the run
command. For example,
run > outfilestarts your program, diverting its output to the file `outfile'.
Another way to specify where your program should do input and output is
with the tty
command. This command accepts a file name as
argument, and causes this file to be the default for future run
commands. It also resets the controlling terminal for the child
process, for future run
commands. For example,
tty /dev/ttybdirects that processes started with subsequent
run
commands
default to do input and output on the terminal `/dev/ttyb' and have
that as their controlling terminal.
An explicit redirection in run
overrides the tty
command's
effect on the input/output device, but not its effect on the controlling
terminal.
When you use the tty
command or redirect input in the run
command, only the input for your program is affected. The input
for GDB still comes from your terminal.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
attach process-id
info files
shows your active
targets.) The command takes as argument a process ID. The usual way to
find out the process-id of a Unix process is with the ps
utility,
or with the `jobs -l' shell command.
attach
does not repeat if you press RET a second time after
executing the command.
To use attach
, your program must be running in an environment
which supports processes; for example, attach
does not work for
programs on bare-board targets that lack an operating system. You must
also have permission to send the process a signal.
When you use attach
, the debugger finds the program running in
the process first by looking in the current working directory, then (if
the program is not found) by using the source file search path
(see Source Path). You can also use
the file
command to load the program. See Files.
The first thing GDB does after arranging to debug the specified
process is to stop it. You can examine and modify an attached process
with all the GDB commands that are ordinarily available when
you start processes with run
. You can insert breakpoints; you
can step and continue; you can modify storage.
See Breakpoints. If you would
rather the process continue running, you may use the continue
command after attaching GDB to the process.
detach
detach
command to release it from GDB control. Detaching
the process continues its execution. After the detach
command,
that process and GDB become completely independent once more, and you
are ready to attach
another process or start one with run
.
detach
does not repeat if you press RET again after
executing the command.
If you exit GDB or use the run
command while you have an
attached process, you kill that process. By default, GDB asks
for confirmation if you try to do either of these things; you can
control whether or not you need to confirm by using the set
confirm
command (see Messages/Warnings).
NOTE: When GDB attaches to a running program you may get a message sayingAttaching to process #nnnnn failed
."The most likely cause for this message is that you have attached to a process that was started across an NFS mount. The HP-UX kernel has had a restriction that prevents a debugger from attaching to a process started from an NFS mount, unless the mount was made non-interruptable with the
-nointr
flag, seemount(1)
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
kill
This command is useful if you wish to debug a core dump instead of a running process. GDB ignores any core dump file while your program is running.
On some operating systems, a program cannot be executed outside GDB
while you have breakpoints set on it inside GDB. You can use the
kill
command in this situation to permit running your program
outside the debugger.
The kill
command is also useful if you wish to recompile and
relink your program, since on many systems it is impossible to modify an
executable file while it is running in a process. In this case, when you
next type run
, GDB notices that the file has changed, and
reads the symbol table again (while trying to preserve your current
breakpoint settings).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In some operating systems, such as HP-UX and Solaris, a single program may have more than one thread of execution. The precise semantics of threads differ from one operating system to another, but in general the threads of a single program are akin to multiple processes--except that they share one address space (that is, they can all examine and modify the same variables). On the other hand, each thread has its own registers and execution stack, and perhaps private memory.
GDB provides these facilities for debugging multi-thread programs:
Warning: These facilities are not yet available on every GDB configuration where the operating system supports threads. If your GDB does not support threads, these commands have no effect. For example, a system without thread support shows no output from `info threads', and always rejects thethread
command, like this:
(gdb) info threads (gdb) thread 1 Thread ID 1 not known. Use the "info threads" command to see the IDs of currently known threads.
The GDB thread debugging facility allows you to observe all threads while your program runs--but whenever GDB takes control, one thread in particular is always the focus of debugging. This thread is called the current thread. Debugging commands show program information from the perspective of the current thread.
Whenever GDB detects a new thread in your program, it displays the target system's identification for the thread with a message in the form `[New systag]'. systag is a thread identifier whose form varies depending on the particular system. For example, on LynxOS, you might see
[New process 35 thread 27]when GDB notices a new thread. In contrast, on an SGI system, the systag is simply something like `process 368', with no further qualifier.
For debugging purposes, GDB associates its own thread number--always a single integer--with each thread in your program.
info threads
For example,
(gdb) info threads
3 process 35 thread 27 0x34e5 in sigpause ()
2 process 35 thread 23 0x34e5 in sigpause ()
* 1 process 35 thread 13 main (argc=1, argv=0x7ffffff8)
at threadtest.c:68
On HP-UX systems:
For debugging purposes, GDB associates its own thread number--a small integer assigned in thread-creation order--with each thread in your program.
Whenever GDB detects a new thread in your program, it displays both GDB's thread number and the target system's identification for the thread with a message in the form `[New systag]'. systag is a thread identifier whose form varies depending on the particular system. For example, on HP-UX, you see
[New thread 2 (system thread 26594)]when GDB notices a new thread.
On HP-UX systems, you can control the display of thread creation messages.
set threadverbose on
set threadverbose off
show threadverbose
Here are commands to get more information about threads:
info threads
For example,
(gdb) info threads * 3 system thread 26607 worker (wptr=0x7b09c318 "@") at quicksort.c:137 2 system thread 26606 0x7b0030d8 in __ksleep () from /usr/lib/libc.2 1 system thread 27905 0x7b003498 in _brk () from /usr/lib/libc.2
thread threadno
(gdb) thread 2
[Switching to thread 2 (system thread 26594)]
0x34e5 in sigpause ()
As with the `[New ...]' message, the form of the text after
`Switching to' depends on your system's conventions for identifying
threads.
thread apply [threadno] [all] args
thread apply
command allows you to apply a command to one or
more threads. Specify the numbers of the threads that you want affected
with the command argument threadno. threadno is the internal
GDB thread number, as shown in the first field of the `info
threads' display. To apply a command to all threads, use
thread apply all
args.
Whenever GDB stops your program, due to a breakpoint or a signal, it automatically selects the thread where that breakpoint or signal happened. GDB alerts you to the context switch with a message of the form `[Switching to systag]' to identify the thread.
See Thread Stops, for more information about how GDB behaves when you stop and start programs with multiple threads.
See Set Watchpoints, for information about watchpoints in programs with multiple threads.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
On most systems, GDB has no special support for debugging
programs which create additional processes using the fork
function. When a program forks, GDB will continue to debug the
parent process and the child process will run unimpeded. If you have
set a breakpoint in any code which the child then executes, the child
will get a SIGTRAP
signal which (unless it catches the signal)
will cause it to terminate.
However, if you want to debug the child process there is a workaround
which isn't too painful. Put a call to sleep
in the code which
the child process executes after the fork. It may be useful to sleep
only if a certain environment variable is set, or a certain file exists,
so that the delay need not occur when you don't want to run GDB
on the child. While the child is sleeping, use the ps
program to
get its process ID. Then tell GDB (a new invocation of
GDB if you are also debugging the parent process) to attach to
the child process (see Attach). From that point on you can debug
the child process just like any other process which you attached to.
On HP-UX (11.x and later only), GDB provides support for
debugging programs that create additional processes using the
fork
or vfork
function.
By default, when a program forks, GDB will continue to debug the parent process and the child process will run unimpeded.
If you want to follow the child process instead of the parent process,
use the command set follow-fork-mode
.
set follow-fork-mode mode
fork
or
vfork
. A call to fork
or vfork
creates a new
process. The mode can be:
parent
child
show follow-fork-mode
fork
or vfork
call.
If you ask to debug a child process and a vfork
is followed by an
exec
, GDB executes the new target up to the first
breakpoint in the new target. If you have a breakpoint set on
main
in your original program, the breakpoint will also be set on
the child process's main
.
When a child process is spawned by vfork
, you cannot debug the
child or parent until an exec
call completes.
If you issue a run
command to GDB after an exec
call executes, the new target restarts. To restart the parent process,
use the file
command with the parent executable name as its
argument.
You can use the catch
command to make GDB stop whenever
a fork
, vfork
, or exec
call is made. See Set Catchpoints.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The principal purposes of using a debugger are so that you can stop your program before it terminates; or so that, if your program runs into trouble, you can investigate and find out why.
Inside GDB, your program may stop for any of several reasons,
such as a signal, a breakpoint, or reaching a new line after a
GDB command such as step
. You may then examine and
change variables, set new breakpoints or remove old ones, and then
continue execution. Usually, the messages shown by GDB provide
ample explanation of the status of your program--but you can also
explicitly request this information at any time.
info program
Breakpoints Breakpoints, watchpoints, and catchpoints Continuing and Stepping Resuming execution Signals Signals Thread Stops Stopping and starting multi-thread programs
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A breakpoint makes your program stop whenever a certain point in
the program is reached. For each breakpoint, you can add conditions to
control in finer detail whether your program stops. You can set
breakpoints with the break
command and its variants (see Set Breaks), to specify the place where your program
should stop by line number, function name or exact address in the
program.
In HP-UX, SunOS 4.x, SVR4, and Alpha OSF/1 configurations, you can set breakpoints in shared libraries before the executable is run. See Shared library breakpoints.
A watchpoint is a special breakpoint that stops your program when the value of an expression changes. You must use a different command to set watchpoints (see Set Watchpoints), but aside from that, you can manage a watchpoint like any other breakpoint: you enable, disable, and delete both breakpoints and watchpoints using the same commands.
You can arrange to have values from your program displayed automatically whenever GDB stops at a breakpoint. See Auto Display.
A catchpoint is another special breakpoint that stops your program
when a certain kind of event occurs, such as the throwing of a C++
exception or the loading of a library. As with watchpoints, you use a
different command to set a catchpoint (see Set Catchpoints), but aside from that, you can manage a catchpoint like any
other breakpoint. (To stop when your program receives a signal, use the
handle
command; see Signals.)
GDB assigns a number to each breakpoint, watchpoint, or catchpoint when you create it; these numbers are successive integers starting with one. In many of the commands for controlling various features of breakpoints you use the breakpoint number to say which breakpoint you want to change. Each breakpoint may be enabled or disabled; if disabled, it has no effect on your program until you enable it again.
Some GDB commands accept a range of breakpoints on which to operate. A breakpoint range is either a single breakpoint number, like `5', or two such numbers, in increasing order, separated by a hyphen, like `5-7'. When a breakpoint range is given to a command, all breakpoint in that range are operated on.
Set Breaks Setting breakpoints Set Watchpoints Setting watchpoints Set Catchpoints Setting catchpoints Delete Breaks Deleting breakpoints Disabling Disabling breakpoints Conditions Break conditions Break Commands Breakpoint command lists Breakpoint Menus Breakpoint menus Error in Breakpoints "Cannot insert breakpoints"
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Breakpoints are set with the break
command (abbreviated
b
). The debugger convenience variable `$bpnum' records the
number of the breakpoints you've set most recently; see Convenience Vars, for a discussion of what you can do with
convenience variables.
You have several ways to say where the breakpoint should go.
break function
break +offset
break -offset
break linenum
break filename:linenum
break filename:function
break *address
break
break
sets a breakpoint at
the next instruction to be executed in the selected stack frame
(see Stack). In any selected frame but the
innermost, this makes your program stop as soon as control
returns to that frame. This is similar to the effect of a
finish
command in the frame inside the selected frame--except
that finish
does not leave an active breakpoint. If you use
break
without an argument in the innermost frame, GDB stops
the next time it reaches the current location; this may be useful
inside loops.
GDB normally ignores breakpoints when it resumes execution, until at least one instruction has been executed. If it did not do this, you would be unable to proceed past a breakpoint without first disabling the breakpoint. This rule applies whether or not the breakpoint already existed when your program stopped.
break ... if cond
tbreak args
break
command, and the breakpoint is set in the same
way, but the breakpoint is automatically deleted after the first time your
program stops there. See Disabling.
hbreak args
break
command and the breakpoint is set in the same way, but the
breakpoint requires hardware support and some target hardware may not
have this support. The main purpose of this is EPROM/ROM code
debugging, so you can set a breakpoint at an instruction without
changing the instruction. This can be used with the new trap-generation
provided by SPARClite DSU and some x86-based targets. These targets
will generate traps when a program accesses some data or instruction
address that is assigned to the debug registers. However the hardware
breakpoint registers can take a limited number of breakpoints. For
example, on the DSU, only two data breakpoints can be set at a time, and
GDB will reject this command if more than two are used. Delete
or disable unused hardware breakpoints before setting new ones
(see Disabling). See Conditions.
thbreak args
hbreak
command and the breakpoint is set in
the same way. However, like the tbreak
command,
the breakpoint is automatically deleted after the
first time your program stops there. Also, like the hbreak
command, the breakpoint requires hardware support and some target hardware
may not have this support. See Disabling.
See also Conditions.
rbreak regex
break
command. You can delete them, disable them, or make
them conditional the same way as any other breakpoint.
The syntax of the regular expression is the standard one used with tools
like `grep'. Note that this is different from the syntax used by
shells, so for instance foo*
matches all functions that include
an fo
followed by zero or more o
s. There is an implicit
.*
leading and trailing the regular expression you supply, so to
match only functions that begin with foo
, use ^foo
.
When debugging C++ programs, rbreak
is useful for setting
breakpoints on overloaded functions that are not members of any special
classes.
info breakpoints [n]
info break [n]
info watchpoints [n]
If a breakpoint is conditional, info break
shows the condition on
the line following the affected breakpoint; breakpoint commands, if any,
are listed after that.
info break
with a breakpoint
number n as argument lists only that breakpoint. The
convenience variable $_
and the default examining-address for
the x
command are set to the address of the last breakpoint
listed (see Memory).
info break
displays a count of the number of times the breakpoint
has been hit. This is especially useful in conjunction with the
ignore
command. You can ignore a large number of breakpoint
hits, look at the breakpoint info to see how many times the breakpoint
was hit, and then run again, ignoring one less than that number. This
will get you quickly to the last hit of that breakpoint.
GDB allows you to set any number of breakpoints at the same place in your program. There is nothing silly or meaningless about this. When the breakpoints are conditional, this is even useful (see Conditions).
GDB itself sometimes sets breakpoints in your program for special
purposes, such as proper handling of longjmp
(in C programs).
These internal breakpoints are assigned negative numbers, starting with
-1
; `info breakpoints' does not display them.
You can see these breakpoints with the GDB maintenance command `maint info breakpoints'.
maint info breakpoints
breakpoint
watchpoint
longjmp
longjmp
calls.
longjmp resume
longjmp
.
until
until
command.
finish
finish
command.
shlib events
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In some situations hardware breakpoints may not be available (e.g. HP-UX 10.20) or you may want to try something other than a hardware watchpoint.
One thing to try is to make a command line call to mprotect()
in your
program to manually protect the page yourself. See mprotect(2)
man page
for explicit information and limitations.
A situation where you might choose to use this technique would be if you find that an instruction is being rewritten or a single data value is corrupted by an errant pointer.
The limitation is that since one protects the entire page, this becomes unwieldy if a lot changes on that page. You need to make sure that there are few other access to the page.
An example of this technique might be:
(gdb) dissass myfunction ; disassemble functions, get address
0x7aefa260 <myfunction>:stw %r19,-0x1c(%sr0,%sp)
0x7aefa264 <myfunction+4>:ldil L'-0x40000000,%r1
...
End of assembler dump.
(gdb) p mprotect(0x7aefa000,0x1000,0x5) ; protect one page one
Make certain to remove any debugger breakpoints from the page or other
reasons the debugger might want to write to the page
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use a watchpoint to stop execution whenever the value of an expression changes, without having to predict a particular place where this may happen.
Depending on your system, watchpoints may be implemented in software or hardware. GDB does software watchpoints by single-stepping your program and testing the variable's value each time, which is hundreds of times slower than normal execution. (But this may still be worth it, to catch errors where you have no clue what part of your program is the culprit.)
On some systems, such as HP-UX 11.x, Linux and some other x86-based targets, GDB includes support for hardware watchpoints, which do not slow down the running of your program.
watch expr
rwatch expr
awatch expr
info watchpoints
info break
.
GDB sets a hardware watchpoint if possible. Hardware watchpoints execute very quickly, and the debugger reports a change in value at the exact instruction where the change occurs. If GDB cannot set a hardware watchpoint, it sets a software watchpoint, which executes more slowly and reports the change in value at the next statement, not the instruction, after the change occurs.
When you issue the watch
command, GDB reports
Hardware watchpoint num: exprif it was able to set a hardware watchpoint.
NOTE: HP-UX does not supportCurrently, theawatch
andrwatch
but does support hardware watchpoints using page protection.
awatch
and rwatch
commands can only set
hardware watchpoints, because accesses to data that don't change the
value of the watched expression cannot be detected without examining
every instruction as it is being executed, and GDB does not do
that currently. If GDB finds that it is unable to set a
hardware breakpoint with the awatch
or rwatch
command, it
will print a message like this:
Expression cannot be implemented with read/access watchpoint.
Sometimes, GDB cannot set a hardware watchpoint because the
data type of the watched expression is wider than what a hardware
watchpoint on the target machine can handle. For example, some systems
can only watch regions that are up to 4 bytes wide; on such systems you
cannot set hardware watchpoints for an expression that yields a
double-precision floating-point number (which is typically 8 bytes
wide). As a work-around, it might be possible to break the large region
into a series of smaller ones and watch them with separate watchpoints.
If you set too many hardware watchpoints, GDB might be unable to insert all of them when you resume the execution of your program. Since the precise number of active watchpoints is unknown until such time as the program is about to be resumed, GDB might not be able to warn you about this when you set the watchpoints, and the warning will be printed only when the program is resumed:
Hardware watchpoint num: Could not insert watchpoint
If this happens, delete or disable some of the watchpoints.
The SPARClite DSU will generate traps when a program accesses some data
or instruction address that is assigned to the debug registers. For the
data addresses, DSU facilitates the watch
command. However the
hardware breakpoint registers can only take two data watchpoints, and
both watchpoints must be the same kind. For example, you can set two
watchpoints with watch
commands, two with rwatch
commands,
or two with awatch
commands, but you cannot set one
watchpoint with one command and the other with a different command.
GDB will reject the command if you try to mix watchpoints.
Delete or disable unused watchpoint commands before setting new ones.
If you call a function interactively using print
or call
,
any watchpoints you have set will be inactive until GDB reaches another
kind of breakpoint or the call completes.
GDB automatically deletes watchpoints that watch local
(automatic) variables, or expressions that involve such variables, when
they go out of scope, that is, when the execution leaves the block in
which these variables were defined. In particular, when the program
being debugged terminates, all local variables go out of scope,
and so only watchpoints that watch global variables remain set. If you
rerun the program, you will need to set all such watchpoints again. One
way of doing that would be to set a code breakpoint at the entry to the
main
function and when it breaks, set all the watchpoints.
Warning: In multi-thread programs, software watchpoints have only limited usefulness. If GDB creates a software watchpoint, it can only watch the value of an expression in a single thread. If you are confident that the expression can only change due to the current thread's activity (and if you are also confident that no other thread can become current), then you can use software watchpoints as usual. However, GDB may not notice when a non-current thread's activity changes the expression. (Hardware watchpoints, in contrast, watch an expression in all threads.)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use catchpoints to cause the debugger to stop for certain
kinds of program events, such as C++ exceptions or the loading of a
shared library. Use the catch
command to set a catchpoint.
catch event
throw
catch
exec
exec
. This is currently only available for HP-UX.
fork
fork
. This is currently only available for HP-UX.
vfork
vfork
. This is currently only available for HP-UX.
load
load libname
unload
unload libname
tcatch event
Use the info break
command to list the current catchpoints.
There are currently some limitations to C++ exception handling
(catch throw
and catch catch
) in GDB:
catch
is not the best way to debug exception handling:
if you need to know exactly where an exception is raised, it is better to
stop before the exception handler is called, since that way you
can see the stack before any unwinding takes place. If you set a
breakpoint in an exception handler instead, it may not be easy to find
out where the exception was raised.
To stop just before an exception handler is called, you need some
knowledge of the implementation. In the case of GNU C++, exceptions are
raised by calling a library function named __raise_exception
which has the following ANSI C interface:
/* addr is where the exception identifier is stored. id is the exception identifier. */ void __raise_exception (void **addr, void *id);To make the debugger catch all exceptions before any stack unwinding takes place, set a breakpoint on
__raise_exception
(see Breakpoints).
With a conditional breakpoint (see Conditions) that depends on the value of id, you can stop your program when a specific exception is raised. You can use multiple conditional breakpoints to stop your program when any of a number of exceptions are raised.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
It is often necessary to eliminate a breakpoint, watchpoint, or catchpoint once it has done its job and you no longer want your program to stop there. This is called deleting the breakpoint. A breakpoint that has been deleted no longer exists; it is forgotten.
With the clear
command you can delete breakpoints according to
where they are in your program. With the delete
command you can
delete individual breakpoints, watchpoints, or catchpoints by specifying
their breakpoint numbers.
It is not necessary to delete a breakpoint to proceed past it. GDB automatically ignores breakpoints on the first instruction to be executed when you continue execution without changing the execution address.
clear
clear function
clear filename:function
clear linenum
clear filename:linenum
delete [breakpoints] [bnums...]
set
confirm off
). You can abbreviate this command as d
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Rather than deleting a breakpoint, watchpoint, or catchpoint, you might prefer to disable it. This makes the breakpoint inoperative as if it had been deleted, but remembers the information on the breakpoint so that you can enable it again later.
You disable and enable breakpoints, watchpoints, and catchpoints with
the enable
and disable
commands, optionally specifying one
or more breakpoint numbers as arguments. Use info break
or
info watch
to print a list of breakpoints, watchpoints, and
catchpoints if you do not know which numbers to use.
A breakpoint, watchpoint, or catchpoint can have any of four different states of enablement:
break
command starts out in this state.
tbreak
command starts out in this state.
disable [breakpoints] [bnums...]
disable
as dis
.
enable [breakpoints] [bnums...]
enable [breakpoints] once bnums...
enable [breakpoints] delete bnums...
Except for a breakpoint set with tbreak
(see Set Breaks), breakpoints that you set are initially enabled;
subsequently, they become disabled or enabled only when you use one of
the commands above. (The command until
can set and delete a
breakpoint of its own, but it does not change the state of your other
breakpoints; see Continuing and Stepping.)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The simplest sort of breakpoint breaks every time your program reaches a specified place. You can also specify a condition for a breakpoint. A condition is just a Boolean expression in your programming language (see Expressions). A breakpoint with a condition evaluates the expression each time your program reaches it, and your program stops only if the condition is true.
This is the converse of using assertions for program validation; in that situation, you want to stop when the assertion is violated--that is, when the condition is false. In C, if you want to test an assertion expressed by the condition assert, you should set the condition `! assert' on the appropriate breakpoint.
Conditions are also accepted for watchpoints; you may not need them, since a watchpoint is inspecting the value of an expression anyhow--but it might be simpler, say, to just set a watchpoint on a variable name, and specify a condition that tests whether the new value is an interesting one.
Break conditions can have side effects, and may even call functions in your program. This can be useful, for example, to activate functions that log program progress, or to use your own print functions to format special data structures. The effects are completely predictable unless there is another enabled breakpoint at the same address. (In that case, GDB might see the other breakpoint first and stop your program without checking the condition of this one.) Note that breakpoint commands are usually more convenient and flexible than break conditions for the purpose of performing side effects when a breakpoint is reached (see Break Commands).
Break conditions can be specified when a breakpoint is set, by using
`if' in the arguments to the break
command. See Set Breaks. They can also be changed at any time
with the condition
command.
You can also use the if
keyword with the watch
command.
The catch
command does not recognize the if
keyword;
condition
is the only way to impose a further condition on a
catchpoint.
condition bnum expression
condition
, GDB checks expression immediately for
syntactic correctness, and to determine whether symbols in it have
referents in the context of your breakpoint. If expression uses
symbols not referenced in the context of the breakpoint, GDB
prints an error message:
No symbol "foo" in current context.GDB does not actually evaluate expression at the time the
condition
command (or a command that sets a breakpoint with a condition, like
break if ...
) is given, however. See Expressions.
condition bnum
A special case of a breakpoint condition is to stop only when the breakpoint has been reached a certain number of times. This is so useful that there is a special way to do it, using the ignore count of the breakpoint. Every breakpoint has an ignore count, which is an integer. Most of the time, the ignore count is zero, and therefore has no effect. But if your program reaches a breakpoint whose ignore count is positive, then instead of stopping, it just decrements the ignore count by one and continues. As a result, if the ignore count value is n, the breakpoint does not stop the next n times your program reaches it.
ignore bnum count
To make the breakpoint stop the next time it is reached, specify a count of zero.
When you use continue
to resume execution of your program from a
breakpoint, you can specify an ignore count directly as an argument to
continue
, rather than using ignore
. See Continuing and Stepping.
If a breakpoint has a positive ignore count and a condition, the condition is not checked. Once the ignore count reaches zero, GDB resumes checking the condition.
You could achieve the effect of the ignore count with a condition such as `$foo-- <= 0' using a debugger convenience variable that is decremented each time. See Convenience Vars.
Ignore counts apply to breakpoints, watchpoints, and catchpoints.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can give any breakpoint (or watchpoint or catchpoint) a series of commands to execute when your program stops due to that breakpoint. For example, you might want to print the values of certain expressions, or enable other breakpoints.
commands [bnum]
... command-list ...
end
end
to terminate the commands.
To remove all commands from a breakpoint, type commands
and
follow it immediately with end
; that is, give no commands.
With no bnum argument, commands
refers to the last
breakpoint, watchpoint, or catchpoint set (not to the breakpoint most
recently encountered).
Pressing RET as a means of repeating the last GDB command is disabled within a command-list.
You can use breakpoint commands to start your program up again. Simply
use the continue
command, or step
, or any other command
that resumes execution.
Any other commands in the command list, after a command that resumes
execution, are ignored. This is because any time you resume execution
(even with a simple next
or step
), you may encounter
another breakpoint--which could have its own command list, leading to
ambiguities about which list to execute.
If the first command you specify in a command list is silent
, the
usual message about stopping at a breakpoint is not printed. This may
be desirable for breakpoints that are to print a specific message and
then continue. If none of the remaining commands print anything, you
see no sign that the breakpoint was reached. silent
is
meaningful only at the beginning of a breakpoint command list.
The commands echo
, output
, and printf
allow you to
print precisely controlled output, and are often useful in silent
breakpoints. See Output.
For example, here is how you could use breakpoint commands to print the
value of x
at entry to foo
whenever x
is positive.
break foo if x>0 commands silent printf "x is %d\n",x cont endOne application for breakpoint commands is to compensate for one bug so you can test for another. Put a breakpoint just after the erroneous line of code, give it a condition to detect the case in which something erroneous has been done, and give it commands to assign correct values to any variables that need them. End with the
continue
command
so that your program does not stop, and start with the silent
command so that no output is produced. Here is an example:
break 403 commands silent set x = y + 4 cont end
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some programming languages (notably C++) permit a single function name
to be defined several times, for application in different contexts.
This is called overloading. When a function name is overloaded,
`break function' is not enough to tell GDB where you want
a breakpoint. If you realize this is a problem, you can use
something like `break function(types)' to specify which
particular version of the function you want. Otherwise, GDB offers
you a menu of numbered choices for different possible breakpoints, and
waits for your selection with the prompt `>'. The first two
options are always `[0] cancel' and `[1] all'. Typing 1
sets a breakpoint at each definition of function, and typing
0 aborts the break
command without setting any new
breakpoints.
For example, the following session excerpt shows an attempt to set a
breakpoint at the overloaded symbol String::after
.
We choose three particular definitions of that function name:
(gdb) b String::after
[0] cancel
[1] all
[2] file:String.cc; line number:867
[3] file:String.cc; line number:860
[4] file:String.cc; line number:875
[5] file:String.cc; line number:853
[6] file:String.cc; line number:846
[7] file:String.cc; line number:735
> 2 4 6
Breakpoint 1 at 0xb26c: file String.cc, line 867.
Breakpoint 2 at 0xb344: file String.cc, line 875.
Breakpoint 3 at 0xafcc: file String.cc, line 846.
Multiple breakpoints were set.
Use the "delete" command to delete unwanted
breakpoints.
(gdb)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Cannot insert breakpoints. The same program may be running in another process.When this happens, you have three ways to proceed:
exec-file
command to specify
that GDB should run your program under that name.
Then start your program again.
Stopped; cannot insert breakpoints.
You may have requested too many hardware breakpoints and watchpoints.
This message is printed when you attempt to resume the program, since
only then GDB knows exactly how many hardware breakpoints and
watchpoints it needs to insert.
When this message is printed, you need to disable or remove some of the hardware-assisted breakpoints and watchpoints, and then continue.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Continuing means resuming program execution until your program
completes normally. In contrast, stepping means executing just
one more "step" of your program, where "step" may mean either one
line of source code, or one machine instruction (depending on what
particular command you use). Either when continuing or when stepping,
your program may stop even sooner, due to a breakpoint or a signal. (If
it stops due to a signal, you may want to use handle
, or use
`signal 0' to resume execution. See Signals.)
continue [ignore-count]
c [ignore-count]
fg [ignore-count]
ignore
(see Conditions).
The argument ignore-count is meaningful only when your program
stopped due to a breakpoint. At other times, the argument to
continue
is ignored.
The synonyms c
and fg
(for foreground, as the
debugged program is deemed to be the foreground program) are provided
purely for convenience, and have exactly the same behavior as
continue
.
To resume execution at a different place, you can use return
(see Returning) to go back to the
calling function; or jump
(see Jumping) to go to an arbitrary location in your program.
A typical technique for using stepping is to set a breakpoint (see Breakpoints) at the beginning of the function or the section of your program where a problem is believed to lie, run your program until it stops at that breakpoint, and then step through the suspect area, examining the variables that are interesting, until you see the problem happen.
step
s
.
Warning: If you use theThestep
command while control is within a function that was compiled without debugging information, execution proceeds until control reaches a function that does have debugging information. Likewise, it will not step into a function which is compiled without debugging information. To step through functions without debugging information, use thestepi
command, described below.
step
command only stops at the first instruction of a
source line. This prevents the multiple stops that could otherwise occur in
switch statements, for loops, etc. step
continues to stop if a
function that has debugging information is called within the line.
In other words, step
steps inside any functions called
within the line.
Also, the step
command only enters a function if there is line
number information for the function. Otherwise it acts like the
next
command. This avoids problems when using cc -gl
on MIPS machines. Previously, step
entered subroutines if there
was any debugging information about the routine.
step count
step
, but do so count times. If a
breakpoint is reached, or a signal not related to stepping occurs before
count steps, stepping stops right away.
next [count]
step
, but function calls that appear within
the line of code are executed without stopping. Execution stops when
control reaches a different line of code at the original stack level
that was executing when you gave the next
command. This command
is abbreviated n
.
An argument count is a repeat count, as for step
.
The next
command only stops at the first instruction of a
source line. This prevents multiple stops that could otherwise occur in
switch statements, for loops, etc.
finish
Contrast this with the return
command (see Returning).
until
u
next
command, except that when until
encounters a jump, it
automatically continues execution until the program counter is greater
than the address of the jump.
This means that when you reach the end of a loop after single stepping
though it, until
makes your program continue execution until it
exits the loop. In contrast, a next
command at the end of a loop
simply steps back to the beginning of the loop, which forces you to step
through the next iteration.
until
always stops your program if it attempts to exit the current
stack frame.
until
may produce somewhat counterintuitive results if the order
of machine code does not match the order of the source lines. For
example, in the following excerpt from a debugging session, the f
(frame
) command shows that execution is stopped at line
206
; yet when we use until
, we get to line 195
:
(gdb) f #0 main (argc=4, argv=0xf7fffae8) at m4.c:206 206 expand_input(); (gdb) until 195 for ( ; argc > 0; NEXTARG) {This happened because, for execution efficiency, the compiler had generated code for the loop closure test at the end, rather than the start, of the loop--even though the test in a C
for
-loop is
written before the body of the loop. The until
command appeared
to step back to the beginning of the loop when it advanced to this
expression; however, it has not really gone to an earlier
statement--not in terms of the actual machine code.
until
with no argument works by means of single
instruction stepping, and hence is slower than until
with an
argument.
until location
u location
break
(see Set Breaks). This form of the command uses breakpoints,
and hence is quicker than until
without an argument.
stepi
si
It is often useful to do `display/i $pc' when stepping by machine instructions. This makes GDB automatically display the next instruction to be executed, each time your program stops. See Auto Display.
An argument is a repeat count, as in step
.
nexti
ni
An argument is a repeat count, as in next
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A signal is an asynchronous event that can happen in a program. The
operating system defines the possible kinds of signals, and gives each
kind a name and a number. For example, in Unix SIGINT
is the
signal a program gets when you type an interrupt character (often C-c);
SIGSEGV
is the signal a program gets from referencing a place in
memory far away from all the areas in use; SIGALRM
occurs when
the alarm clock timer goes off (which happens only if your program has
requested an alarm).
Some signals, including SIGALRM
, are a normal part of the
functioning of your program. Others, such as SIGSEGV
, indicate
errors; these signals are fatal (they kill your program immediately) if the
program has not specified in advance some other way to handle the signal.
SIGINT
does not indicate an error in your program, but it is normally
fatal so it can carry out the purpose of the interrupt: to kill the program.
GDB has the ability to detect any occurrence of a signal in your program. You can tell GDB in advance what to do for each kind of signal.
Normally, GDB is set up to ignore non-erroneous signals like SIGALRM
(so as not to interfere with their role in the functioning of your program)
but to stop your program immediately whenever an error signal happens.
You can change these settings with the handle
command.
info signals
info handle
is an alias for info signals
.
handle signal keywords...
The keywords allowed by the handle
command can be abbreviated.
Their full names are:
nostop
stop
print
keyword as well.
print
noprint
nostop
keyword as well.
pass
nopass
When a signal stops your program, the signal is not visible to the
program until you
continue. Your program sees the signal then, if pass
is in
effect for the signal in question at that time. In other words,
after GDB reports a signal, you can use the handle
command with pass
or nopass
to control whether your
program sees that signal when you continue.
You can also use the signal
command to prevent your program from
seeing a signal, or cause it to see a signal it normally would not see,
or to give it any signal at any time. For example, if your program stopped
due to some sort of memory reference error, you might store correct
values into the erroneous variables and continue, hoping to see more
execution; but your program would probably terminate immediately as
a result of the fatal signal once it saw the signal. To prevent this,
you can continue with `signal 0'. See Signaling.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When your program has multiple threads (see Threads), you can choose whether to set breakpoints on all threads, or on a particular thread.
break linespec thread threadno
break linespec thread threadno if ...
Use the qualifier `thread threadno' with a breakpoint command to specify that you only want GDB to stop the program when a particular thread reaches this breakpoint. threadno is one of the numeric thread identifiers assigned by GDB, shown in the first column of the `info threads' display.
If you do not specify `thread threadno' when you set a breakpoint, the breakpoint applies to all threads of your program.
You can use the thread
qualifier on conditional breakpoints as
well; in this case, place `thread threadno' before the
breakpoint condition, like this:
(gdb) break frik.c:13 thread 28 if bartab > lim
Whenever your program stops under GDB for any reason, all threads of execution stop, not just the current thread. This allows you to examine the overall state of the program, including switching between threads, without worrying that things may change underfoot.
Conversely, whenever you restart the program, all threads start
executing. This is true even when single-stepping with commands
like step
or next
.
In particular, GDB cannot single-step all threads in lockstep. Since thread scheduling is up to your debugging target's operating system (not controlled by GDB), other threads may execute more than one statement while the current thread completes a single step. Moreover, in general other threads stop in the middle of a statement, rather than at a clean statement boundary, when the program stops.
You might even find your program stopped in another thread after continuing or even single-stepping. This happens whenever some other thread runs into a breakpoint, a signal, or an exception before the first thread completes whatever you requested.
On some OSes, you can lock the OS scheduler and thus allow only a single thread to run.
set scheduler-locking mode
off
, then there is no
locking and any thread may run at any time. If on
, then only the
current thread may run when the inferior is resumed. The step
mode optimizes for single-stepping. It stops other threads from
"seizing the prompt" by preempting the current thread while you are
stepping. Other threads will only rarely (or never) get a chance to run
when you step. They are more likely to run when you `next' over a
function call, and they are completely free to run when you use commands
like `continue', `until', or `finish'. However, unless another
thread hits a breakpoint during its timeslice, they will never steal the
GDB prompt away from the thread that you are debugging.
show scheduler-locking
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When your program has stopped, the first thing you need to know is where it stopped and how it got there.
Each time your program performs a function call, information about the call is generated. That information includes the location of the call in your program, the arguments of the call, and the local variables of the function being called. The information is saved in a block of data called a stack frame. The stack frames are allocated in a region of memory called the call stack.
When your program stops, the GDB commands for examining the stack allow you to see all of this information.
One of the stack frames is selected by GDB and many GDB commands refer implicitly to the selected frame. In particular, whenever you ask GDB for the value of a variable in your program, the value is found in the selected frame. There are special GDB commands to select whichever frame you are interested in. See Selection.
When your program stops, GDB automatically selects the
currently executing frame and describes it briefly, similar to the
frame
command (see Frame Info).
Frames Stack frames Backtrace Backtraces Selection Selecting a frame Frame Info Information on a frame
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The call stack is divided up into contiguous pieces called stack frames, or frames for short; each frame is the data associated with one call to one function. The frame contains the arguments given to the function, the function's local variables, and the address at which the function is executing.
When your program is started, the stack has only one frame, that of the
function main
. This is called the initial frame or the
outermost frame. Each time a function is called, a new frame is
made. Each time a function returns, the frame for that function invocation
is eliminated. If a function is recursive, there can be many frames for
the same function. The frame for the function in which execution is
actually occurring is called the innermost frame. This is the most
recently created of all the stack frames that still exist.
Inside your program, stack frames are identified by their addresses. A stack frame consists of many bytes, each of which has its own address; each kind of computer has a convention for choosing one byte whose address serves as the address of the frame. Usually this address is kept in a register called the frame pointer register while execution is going on in that frame.
GDB assigns numbers to all existing stack frames, starting with zero for the innermost frame, one for the frame that called it, and so on upward. These numbers do not really exist in your program; they are assigned by GDB to give you a way of designating stack frames in GDB commands.
Some compilers provide a way to compile functions so that they operate
without stack frames. (For example, the gcc
option
`-fomit-frame-pointer' generates functions without a frame.)
This is occasionally done with heavily used library functions to save
the frame setup time. GDB has limited facilities for dealing
with these function invocations. If the innermost function invocation
has no stack frame, GDB nevertheless regards it as though
it had a separate frame, which is numbered zero as usual, allowing
correct tracing of the function call chain. However, GDB has
no provision for frameless functions elsewhere in the stack.
frame args
frame
command allows you to move from one stack frame to another,
and to print the stack frame you select. args may be either the
address of the frame or the stack frame number. Without an argument,
frame
prints the current stack frame.
select-frame
select-frame
command allows you to move from one stack frame
to another without printing the frame. This is the silent version of
frame
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A backtrace is a summary of how your program got where it is. It shows one line per frame, for many frames, starting with the currently executing frame (frame zero), followed by its caller (frame one), and on up the stack.
backtrace
bt
You can stop the backtrace at any time by typing the system interrupt character, normally C-c.
backtrace n
bt n
backtrace -n
bt -n
backtrace-other-thread
The names where
and info stack
(abbreviated info s
)
are additional aliases for backtrace
.
Each line in the backtrace shows the frame number and the function name.
The program counter value is also shown--unless you use set
print address off
. The backtrace also shows the source file name and
line number, as well as the arguments to the function. The program
counter value is omitted if it is at the beginning of the code for that
line number.
Here is an example of a backtrace. It was made with the command `bt 3', so it shows the innermost three frames.
#0 m4_traceon (obs=0x24eb0, argc=1, argv=0x2b8c8)
at builtin.c:993
#1 0x6e38 in expand_macro (sym=0x2b600) at macro.c:242
#2 0x6840 in expand_token (obs=0x0, t=177664, td=0xf7fffb08)
at macro.c:71
(More stack frames follow...)
The display for frame zero does not begin with a program counter
value, indicating that your program has stopped at the beginning of the
code for line 993
of builtin.c
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Most commands for examining the stack and other data in your program work on whichever stack frame is selected at the moment. Here are the commands for selecting a stack frame; all of them finish by printing a brief description of the stack frame just selected.
frame n
f n
main
.
frame addr
f addr
On the SPARC architecture, frame
needs two addresses to
select an arbitrary frame: a frame pointer and a stack pointer.
On the MIPS and Alpha architecture, it needs two addresses: a stack pointer and a program counter.
On the 29k architecture, it needs three addresses: a register stack pointer, a program counter, and a memory stack pointer.
up n
down n
down
as do
.
All of these commands end by printing two lines of output describing the frame. The first line shows the frame number, the function name, the arguments, and the source file and line number of execution in that frame. The second line shows the text of that source line.
For example:
(gdb) up
#1 0x22f0 in main (argc=1, argv=0xf7fffbf4, env=0xf7fffbfc)
at env.c:10
10 read_input_file (argv[i]);
After such a printout, the list
command with no arguments
prints ten lines centered on the point of execution in the frame.
See List.
up-silently n
down-silently n
up
and down
,
respectively; they differ in that they do their work silently, without
causing display of the new frame. They are intended primarily for use
in GDB command scripts, where the output might be unnecessary and
distracting.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are several other commands to print information about the selected stack frame.
frame
f
f
. With an
argument, this command is used to select a stack frame.
See Selection.
info frame
info f
info frame addr
info f addr
frame
command.
See Selection.
info args
info locals
info catch
up
,
down
, or frame
commands); then type info catch
.
See Set Catchpoints.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB can print parts of your program's source, since the debugging information recorded in the program tells GDB what source files were used to build it. When your program stops, GDB spontaneously prints the line where it stopped. Likewise, when you select a stack frame (see Selection), GDB prints the line where execution in that frame has stopped. You can print other portions of source files by explicit command.
If you use GDB through its GNU Emacs interface, you may prefer to use Emacs facilities to view source; see Emacs.
List Printing source lines Search Searching source files Source Path Specifying source directories Machine Code Source and machine code
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To print lines from a source file, use the list
command
(abbreviated l
). By default, ten lines are printed.
There are several ways to specify what part of the file you want to print.
Here are the forms of the list
command most commonly used:
list linenum
list function
list
list
command, this prints lines following the last lines
printed; however, if the last line printed was a solitary line printed
as part of displaying a stack frame (see Stack), this prints lines centered around that line.
list -
By default, GDB prints ten source lines with any of these forms of
the list
command. You can change this using set listsize
:
set listsize count
list
command display count source lines (unless
the list
argument explicitly specifies some other number).
show listsize
list
prints.
Repeating a list
command with RET discards the argument,
so it is equivalent to typing just list
. This is more useful
than listing the same lines again. An exception is made for an
argument of `-'; that argument is preserved in repetition so that
each repetition moves up in the source file.
In general, the list
command expects you to supply zero, one or two
linespecs. Linespecs specify source lines; there are several ways
of writing them, but the effect is always to specify some source line.
Here is a complete description of the possible arguments for list
:
list linespec
list first,last
list ,last
list first,
list +
list -
list
Here are the ways of specifying a single source line--all the kinds of linespec.
number
list
command has two linespecs, this refers to
the same source file as the first linespec.
+offset
list
command that has
two, this specifies the line offset lines down from the
first linespec.
-offset
filename:number
function
filename:function
*address
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are two commands for searching through the current source file for a regular expression.
forward-search regexp
search regexp
fo
.
reverse-search regexp
rev
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Executable programs sometimes do not record the directories of the source files from which they were compiled, just the names. Even when they do, the directories could be moved between the compilation and your debugging session. GDB has a list of directories to search for source files; this is called the source path. Each time GDB wants a source file, it tries all the directories in the list, in the order they are present in the list, until it finds a file with the desired name. Note that the executable search path is not used for this purpose. Neither is the current working directory, unless it happens to be in the source path.
If GDB cannot find a source file in the source path, and the object program records a directory, GDB tries that directory too. If the source path is empty, and there is no record of the compilation directory, GDB looks in the current directory as a last resort.
Whenever you reset or rearrange the source path, GDB clears out any information it has cached about where source files are found and where each line is in the file.
When you start GDB, its source path includes only `cdir'
and `cwd', in that order.
To add other directories, use the directory
command.
directory dirname ...
dir dirname ...
You can use the string `$cdir' to refer to the compilation directory (if one is recorded), and `$cwd' to refer to the current working directory. `$cwd' is not the same as `.'---the former tracks the current working directory as it changes during your GDB session, while the latter is immediately expanded to the current directory at the time you add an entry to the source path.
directory
show directories
If your source path is cluttered with directories that are no longer of interest, GDB may sometimes cause confusion by finding the wrong versions of source. You can correct the situation as follows:
directory
with no argument to reset the source path to empty.
directory
with suitable arguments to reinstall the
directories you want in the source path. You can add all the
directories in one command.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use the command info line
to map source lines to program
addresses (and vice versa), and the command disassemble
to display
a range of addresses as machine instructions. When run under GNU Emacs
mode, the info line
command causes the arrow to point to the
line specified. Also, info line
prints addresses in symbolic form as
well as hex.
info line linespec
list
command (see List).
For example, we can use info line
to discover the location of
the object code for the first line of function
m4_changequote
:
(gdb) info line m4_changecom
Line 895 of "builtin.c" starts at pc 0x634c and ends at 0x6350.
We can also inquire (using *addr
as the form for
linespec) what source line covers a particular address:
(gdb) info line *0x63ff
Line 926 of "builtin.c" starts at pc 0x63e4 and ends at 0x6404.
After info line
, the default address for the x
command
is changed to the starting address of the line, so that `x/i' is
sufficient to begin examining the machine code (see Memory). Also, this address is saved as the value of the
convenience variable $_
(see Convenience Vars).
disassemble
The following example shows the disassembly of a range of addresses of HP PA-RISC 2.0 code:
(gdb) disas 0x32c4 0x32e4
Dump of assembler code from 0x32c4 to 0x32e4:
0x32c4 <main+204>: addil 0,dp
0x32c8 <main+208>: ldw 0x22c(sr0,r1),r26
0x32cc <main+212>: ldil 0x3000,r31
0x32d0 <main+216>: ble 0x3f8(sr4,r31)
0x32d4 <main+220>: ldo 0(r31),rp
0x32d8 <main+224>: addil -0x800,dp
0x32dc <main+228>: ldo 0x588(r1),r26
0x32e0 <main+232>: ldil 0x3000,r31
End of assembler dump.
Some architectures have more than one commonly-used set of instruction
mnemonics or other syntax.
set disassembly-flavor instruction-set
disassemble
or x/i
commands.
Currently this command is only defined for the Intel x86 family. You
can set instruction-set to either intel
or att
.
The default is att
, the AT&T flavor used by default by Unix
assemblers for x86-based targets.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The usual way to examine data in your program is with the print
command (abbreviated p
), or its synonym inspect
. It
evaluates and prints the value of an expression of the language your
program is written in (see Languages).
print expr
print /f expr
print
print /f
A more low-level way of examining data is with the x
command.
It examines data in memory at a specified address and prints it in a
specified format. See Memory.
If you are interested in information about types, or about how the
fields of a struct or a class are declared, use the ptype exp
command rather than print
. See Symbols.
Expressions Expressions Variables Program variables Arrays Artificial arrays Output Formats Output formats Memory Examining memory Auto Display Automatic display Print Settings Print settings Value History Value history Convenience Vars Convenience variables Registers Registers Floating Point Hardware Floating point hardware Printing Floating Point Values Printing Floating Point Values
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
print
and many other GDB commands accept an expression and
compute its value. Any kind of constant, variable or operator defined
by the programming language you are using is valid in an expression in
GDB. This includes conditional expressions, function calls, casts
and string constants. It unfortunately does not include symbols defined
by preprocessor #define
commands.
GDB supports array constants in expressions input by
the user. The syntax is {element, element...}. For example,
you can use the command print {1, 2, 3}
to build up an array in
memory that is malloc
ed in the target program.
Because C is so widespread, most of the expressions shown in examples in this manual are in C. See Languages, for information on how to use expressions in other languages.
In this section, we discuss operators that you can use in GDB expressions regardless of your programming language.
Casts are supported in all languages, not just in C, because it is so useful to cast a number into a pointer in order to examine a structure at that address in memory.
GDB supports these operators, in addition to those common to programming languages:
@
::
{type} addr
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The most common kind of expression to use is the name of a variable in your program.
Variables in expressions are understood in the selected stack frame (see Selection); they must be either:
foo (a) int a; { bar (a); { int b = test (); bar (b); } }you can examine and use the variable
a
whenever your program is
executing within the function foo
, but you can only use or
examine the variable b
while your program is executing inside
the block where b
is declared.
There is an exception: you can refer to a variable or function whose scope is a single source file even if the current execution point is not in this file. But it is possible to have more than one such variable or function with the same name (in different source files). If that happens, referring to that name has unpredictable effects. If you wish, you can specify a static variable in a particular function or file, using the colon-colon notation:
file::variable function::variableHere file or function is the name of the context for the static variable. In the case of file names, you can use quotes to make sure GDB parses the file name as a single word--for example, to print a global value of
x
defined in `f2.c':
(gdb) p 'f2.c'::x
This use of `::' is very rarely in conflict with the very similar use of the same notation in C++. GDB also supports use of the C++ scope resolution operator in GDB expressions.
Warning: Occasionally, a local variable may appear to have the wrong value at certain points in a function--just after entry to a new scope, and just before exit.You may see this problem when you are stepping by machine instructions. This is because, on most machines, it takes more than one instruction to set up a stack frame (including local variable definitions); if you are stepping by machine instructions, variables may appear to have the wrong values until the stack frame is completely built. On exit, it usually also takes more than one machine instruction to destroy a stack frame; after you begin stepping through that group of instructions, local variable definitions may be gone.
This may also happen when the compiler does significant optimizations. To be sure of always seeing accurate values, turn off all optimization when compiling.
Another possible effect of compiler optimizations is to optimize unused variables out of existence, or assign variables to registers (as opposed to memory addresses). Depending on the support for such cases offered by the debug info format used by the compiler, GDB might not be able to display values for such local variables. If that happens, GDB will print a message like this:
No symbol "foo" in current context.To solve such problems, either recompile without optimizations, or use a different debug info format, if the compiler supports several such formats. For example, GCC, the GNU C/C++ compiler usually supports the `-gstabs' option. `-gstabs' produces debug info in a format that is superior to formats such as COFF. You may be able to use DWARF-2 (`-gdwarf-2'), which is also an effective form for debug info. See Compilation.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
It is often useful to print out several successive objects of the same type in memory; a section of an array, or an array of dynamically determined size for which only a pointer exists in the program.
You can do this by referring to a contiguous span of memory as an artificial array, using the binary operator `@'. The left operand of `@' should be the first element of the desired array and be an individual object. The right operand should be the desired length of the array. The result is an array value whose elements are all of the type of the left argument. The first element is actually the left argument; the second element comes from bytes of memory immediately following those that hold the first element, and so on. Here is an example. If a program says
int *array = (int *) malloc (len * sizeof (int));you can print the contents of
array
with
p *array@lenThe left operand of `@' must reside in memory. Array values made with `@' in this way behave just like other arrays in terms of subscripting, and are coerced to pointers when used in expressions. Artificial arrays most often appear in expressions via the value history (see Value History), after printing one out.
Another way to create an artificial array is to use a cast. This re-interprets a value as if it were an array. The value need not be in memory:
(gdb) p/x (short[2])0x12345678 $1 = {0x1234, 0x5678}As a convenience, if you leave the array length out (as in `(type[])value') GDB calculates the size to fill the value (as `sizeof(value)/sizeof(type)':
(gdb) p/x (short[])0x12345678 $2 = {0x1234, 0x5678}Sometimes the artificial array mechanism is not quite enough; in moderately complex data structures, the elements of interest may not actually be adjacent--for example, if you are interested in the values of pointers in an array. One useful work-around in this situation is to use a convenience variable (see Convenience Vars) as a counter in an expression that prints the first interesting value, and then repeat that expression via RET. For instance, suppose you have an array
dtab
of pointers to
structures, and you are interested in the values of a field fv
in each structure. Here is an example of what you might type:
set $i = 0 p dtab[$i++]->fv RET RET ...
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, GDB prints a value according to its data type. Sometimes this is not what you want. For example, you might want to print a number in hex, or a pointer in decimal. Or you might want to view data in memory at a certain address as a character string or as an instruction. To do these things, specify an output format when you print a value.
The simplest use of output formats is to say how to print a value
already computed. This is done by starting the arguments of the
print
command with a slash and a format letter. The format
letters supported are:
x
d
u
o
t
a
(gdb) p/a 0x54320 $3 = 0x54320 <_initialize_vx+396>
c
f
For example, to print the program counter in hex (see Registers), type
p/x $pcNote that no space is required before the slash; this is because command names in GDB cannot contain a slash.
To reprint the last value in the value history with a different format,
you can use the print
command with just a format and no
expression. For example, `p/x' reprints the last value in hex.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use the command x
(for "examine") to examine memory in
any of several formats, independently of your program's data types.
x/nfu addr
x addr
x
x
command to examine memory.
n, f, and u are all optional parameters that specify how much memory to display and how to format it; addr is an expression giving the address where you want to start displaying memory. If you use defaults for nfu, you need not type the slash `/'. Several commands set convenient defaults for addr.
print
,
`s' (null-terminated string), or `i' (machine instruction).
The default is `x' (hexadecimal) initially.
The default changes each time you use either x
or print
.
b
h
w
g
Each time you specify a unit size with x
, that size becomes the
default unit the next time you use x
. (For the `s' and
`i' formats, the unit size is ignored and is normally not written.)
info breakpoints
(to
the address of the last breakpoint listed), info line
(to the
starting address of a line), and print
(if you use it to display
a value from memory).
For example, `x/3uh 0x54320' is a request to display three halfwords
(h
) of memory, formatted as unsigned decimal integers (`u'),
starting at address 0x54320
. `x/4xw $sp' prints the four
words (`w') of memory above the stack pointer (here, `$sp';
see Registers) in hexadecimal (`x').
Since the letters indicating unit sizes are all distinct from the letters specifying output formats, you do not have to remember whether unit size or format comes first; either order works. The output specifications `4xw' and `4wx' mean exactly the same thing. (However, the count n must come first; `wx4' does not work.)
Even though the unit size u is ignored for the formats `s'
and `i', you might still want to use a count n; for example,
`3i' specifies that you want to see three machine instructions,
including any operands. The command disassemble
gives an
alternative way of inspecting machine instructions; see Machine Code.
All the defaults for the arguments to x
are designed to make it
easy to continue scanning memory with minimal specifications each time
you use x
. For example, after you have inspected three machine
instructions with `x/3i addr', you can inspect the next seven
with just `x/7'. If you use RET to repeat the x
command,
the repeat count n is used again; the other arguments default as
for successive uses of x
.
The addresses and contents printed by the x
command are not saved
in the value history because there is often too much of them and they
would get in the way. Instead, GDB makes these values available for
subsequent use in expressions as values of the convenience variables
$_
and $__
. After an x
command, the last address
examined is available for use in expressions in the convenience variable
$_
. The contents of that address, as examined, are available in
the convenience variable $__
.
If the x
command has a repeat count, the address and contents saved
are from the last memory unit printed; this is not the same as the last
address printed if several units were printed on the last line of output.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you find that you want to print the value of an expression frequently (to see how it changes), you might want to add it to the automatic display list so that GDB prints its value each time your program stops. Each expression added to the list is given a number to identify it; to remove an expression from the list, you specify that number. The automatic display looks like this:
2: foo = 38 3: bar[5] = (struct hack *) 0x3804This display shows item numbers, expressions and their current values. As with displays you request manually using
x
or print
, you can
specify the output format you prefer; in fact, display
decides
whether to use print
or x
depending on how elaborate your
format specification is--it uses x
if you specify a unit size,
or one of the two formats (`i' and `s') that are only
supported by x
; otherwise it uses print
.
display expr
display
does not repeat if you press RET again after using it.
display/fmt expr
display/fmt addr
For example, `display/i $pc' can be helpful, to see the machine instruction about to be executed each time execution stops (`$pc' is a common name for the program counter; see Registers).
undisplay dnums...
delete display dnums...
undisplay
does not repeat if you press RET after using it.
(Otherwise you would just get the error `No display number ...'.)
disable display dnums...
enable display dnums...
display
info display
If a display expression refers to local variables, then it does not make
sense outside the lexical context for which it was set up. Such an
expression is disabled when execution enters a context where one of its
variables is not defined. For example, if you give the command
display last_char
while inside a function with an argument
last_char
, GDB displays this argument while your program
continues to stop inside that function. When it stops elsewhere--where
there is no variable last_char
---the display is disabled
automatically. The next time your program stops where last_char
is meaningful, you can enable the display expression once again.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB provides the following ways to control how arrays, structures, and symbols are printed.
These settings are useful for debugging programs in any language:
set print address
set print address on
on
. For example, this is what a stack frame display looks like with
set print address on
:
(gdb) f
#0 set_quotes (lq=0x34c78 "<<", rq=0x34c88 ">>")
at input.c:530
530 if (lquote != def_lquote)
set print address off
set print address off
:
(gdb) set print addr off
(gdb) f
#0 set_quotes (lq="<<", rq=">>") at input.c:530
530 if (lquote != def_lquote)
You can use `set print address off' to eliminate all machine
dependent displays from the GDB interface. For example, with
print address off
, you should get the same text for backtraces on
all machines--whether or not they involve pointer arguments.
show print address
When GDB prints a symbolic address, it normally prints the
closest earlier symbol plus an offset. If that symbol does not uniquely
identify the address (for example, it is a name whose scope is a single
source file), you may need to clarify. One way to do this is with
info line
, for example `info line *0x4537'. Alternately,
you can set GDB to print the source file and line number when
it prints a symbolic address:
set print symbol-filename on
set print symbol-filename off
show print symbol-filename
Another situation where it is helpful to show symbol filenames and line numbers is when disassembling code; GDB shows you the line number and source file that corresponds to each instruction.
Also, you may wish to see the symbolic form only if the address being printed is reasonably close to the closest earlier symbol:
set print max-symbolic-offset max-offset
show print max-symbolic-offset
If you have a pointer and you are not sure where it points, try
`set print symbol-filename on'. Then you can determine the name
and source file location of the variable where it points, using
`p/a pointer'. This interprets the address in symbolic form.
For example, here GDB shows that a variable ptt
points
at another variable t
, defined in `hi2.c':
(gdb) set print symbol-filename on (gdb) p/a ptt $4 = 0xe008 <t in hi2.c>
Warning: For pointers that point to a local variable, `p/a'
does not show the symbol name and filename of the referent, even with
the appropriate set print
options turned on.
Other settings control how different kinds of objects are printed:
set print array
set print array on
set print array off
show print array
set print elements number-of-elements
set print elements
command.
This limit also applies to the display of strings.
When GDB starts, this limit is set to 200.
Setting number-of-elements to zero means that the printing is unlimited.
show print elements
set print null-stop
set print pretty on
$1 = {
next = 0x0,
flags = {
sweet = 1,
sour = 1
},
meat = 0x54 "Pork"
}
set print pretty off
$1 = {next = 0x0, flags = {sweet = 1, sour = 1}, \
meat = 0x54 "Pork"}
This is the default format.
show print pretty
set print sevenbit-strings on
\
nnn. This setting is
best if you are working in English (ASCII) and you use the
high-order bit of characters as a marker or "meta" bit.
set print sevenbit-strings off
show print sevenbit-strings
set print union on
set print union off
show print union
For example, given the declarations
typedef enum {Tree, Bug} Species;
typedef enum {Big_tree, Acorn, Seedling} Tree_forms;
typedef enum {Caterpillar, Cocoon, Butterfly}
Bug_forms;
struct thing {
Species it;
union {
Tree_forms tree;
Bug_forms bug;
} form;
};
struct thing foo = {Tree, {Acorn}};
with set print union on
in effect `p foo' would print
$1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}}
and with set print union off
in effect it would print
$1 = {it = Tree, form = {...}}
These settings are of interest when debugging C++ programs:
set print demangle
set print demangle on
show print demangle
set print asm-demangle
set print asm-demangle on
show print asm-demangle
set demangle-style style
auto
gnu
g++
) encoding algorithm.
hp
aCC
) encoding algorithm.
This is the default.
lucid
lcc
) encoding algorithm.
arm
cfront
-generated executables. GDB would
require further enhancement to permit that.
show demangle-style
set print object
set print object on
set print object off
show print object
set print static-members
set print static-members on
set print static-members off
show print static-members
set print vtbl
set print vtbl on
vtbl
commands do not work on programs compiled with the HP
ANSI C++ compiler (aCC
).)
set print vtbl off
show print vtbl
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Values printed by the print
command are saved in the GDB
value history. This allows you to refer to them in other expressions.
Values are kept until the symbol table is re-read or discarded
(for example with the file
or symbol-file
commands).
When the symbol table changes, the value history is discarded,
since the values may contain pointers back to the types defined in the
symbol table.
The values printed are given history numbers by which you can
refer to them. These are successive integers starting with one.
print
shows you the history number assigned to a value by
printing `$num = ' before the value; here num is the
history number.
To refer to any previous value, use `$' followed by the value's
history number. The way print
labels its output is designed to
remind you of this. Just $
refers to the most recent value in
the history, and $$
refers to the value before that.
$$n
refers to the nth value from the end; $$2
is the value just prior to $$
, $$1
is equivalent to
$$
, and $$0
is equivalent to $
.
For example, suppose you have just printed a pointer to a structure and want to see the contents of the structure. It suffices to type
p *$If you have a chain of structures where the component
next
points
to the next one, you can print the contents of the next one with this:
p *$.nextYou can print successive links in the chain by repeating this command--which you can do by just typing RET.
Note that the history records values, not expressions. If the value of
x
is 4 and you type these commands:
print x set x=5then the value recorded in the value history by the
print
command
remains 4 even though the value of x
has changed.
show values
show
values
does not change the history.
show values n
show values +
show values +
produces no display.
Pressing RET to repeat show values n
has exactly the
same effect as `show values +'.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB provides convenience variables that you can use within GDB to hold on to a value and refer to it later. These variables exist entirely within GDB; they are not part of your program, and setting a convenience variable has no direct effect on further execution of your program. That is why you can use them freely.
Convenience variables are prefixed with `$'. Any name preceded by `$' can be used for a convenience variable, unless it is one of the predefined machine-specific register names (see Registers). (Value history references, in contrast, are numbers preceded by `$'. See Value History.)
You can save a value in a convenience variable with an assignment expression, just as you would set a variable in your program. For example:
set $foo = *object_ptrwould save in
$foo
the value contained in the object pointed to by
object_ptr
.
Using a convenience variable for the first time creates it, but its
value is void
until you assign a new value. You can alter the
value with another assignment at any time.
Convenience variables have no fixed types. You can assign a convenience variable any type of value, including structures and arrays, even if that variable already has a value of a different type. The convenience variable, when used as an expression, has the type of its current value.
show convenience
show conv
.
One of the ways to use a convenience variable is as a counter to be incremented or a pointer to be advanced. For example, to print a field from successive elements of an array of structures:
set $i = 0 print bar[$i++]->contentsRepeat that command by typing RET.
Some convenience variables are created automatically by GDB and given values likely to be useful.
$_
$_
is automatically set by the x
command to
the last address examined (see Memory). Other
commands which provide a default address for x
to examine also
set $_
to that address; these commands include info line
and info breakpoint
. The type of $_
is void *
except when set by the x
command, in which case it is a pointer
to the type of $__
.
$__
$__
is automatically set by the x
command
to the value found in the last address examined. Its type is chosen
to match the format in which the data was printed.
$_exitcode
$_exitcode
is automatically set to the exit code when
the program being debugged terminates.
On HP-UX systems, if you refer to a function or variable name that begins with a dollar sign, GDB searches for a user or system name first, before it searches for a convenience variable.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can refer to machine register contents, in expressions, as variables
with names starting with `$'. The names of registers are different
for each machine; use info registers
to see the names used on
your machine.
info registers
info all-registers
info registers regname ...
GDB has four "standard" register names that are available (in
expressions) on most machines--whenever they do not conflict with an
architecture's canonical mnemonics for registers. The register names
$pc
and $sp
are used for the program counter register and
the stack pointer. $fp
is used for a register that contains a
pointer to the current stack frame, and $ps
is used for a
register that contains the processor status. For example,
you could print the program counter in hex with
p/x $pcor print the instruction to be executed next with
x/i $pcor add four to the stack pointer(2) with
set $sp += 4Whenever possible, these four standard register names are available on your machine even though the machine has different canonical mnemonics, so long as there is no conflict. The
info registers
command
shows the canonical names. For example, on the SPARC, info
registers
displays the processor status register as $psr
but you
can also refer to it as $ps
, except on Unix systems; and on
x86-based machines $ps
is an alias for the EFLAGS register.
GDB always considers the contents of an ordinary register as an integer when the register is examined in this way. Some machines have special registers which can hold nothing but floating point; these registers are considered to have floating point values. There is no way to refer to the contents of an ordinary register as floating point value (although you can print it as a floating point value with `print/f $regname').
Some registers have distinct "raw" and "virtual" data formats. This
means that the data format in which the register contents are saved by
the operating system is not the same one that your program normally
sees. For example, the registers of the 68881 floating point
coprocessor are always saved in "extended" (raw) format, but all C
programs expect to work with "double" (virtual) format. In such
cases, GDB normally works with the virtual format only (the format
that makes sense for your program), but the info registers
command
prints the data in both formats.
Normally, register values are relative to the selected stack frame (see Selection). This means that you get the value that the register would contain if all stack frames farther in were exited and their saved registers restored. In order to see the true contents of hardware registers, you must select the innermost frame (with `frame 0').
However, GDB must deduce where registers are saved, from the machine code generated by your compiler. If some registers are not saved, or if GDB is unable to locate the saved registers, the selected stack frame makes no difference.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can print the values of floating-point registers in different formats.
To print both single- and double-precision values:
(gdb) info reg $fr5 fr5 (single precision) 10.1444092 fr5 (double precision) 600000To get the bit pattern, try the following macro:
define pbits set *((float *) $sp)=$arg0 p/x *((int *) $sp) endThis is what the macro produces:
(gdb) pbits $fr6 $1 = 0x4082852d
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Depending on the configuration, GDB may be able to give you more information about the status of the floating point hardware.
info float
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Although programming languages generally have common aspects, they are
rarely expressed in the same manner. For instance, in ANSI C,
dereferencing a pointer p
is accomplished by *p
, but in
Modula-2, it is accomplished by p^
. Values can also be
represented (and displayed) differently. Hex numbers in C appear as
`0x1ae', while in Modula-2 they appear as `1AEH'.
Language-specific information is built into GDB for some languages, allowing you to express operations like the above in your program's native language, and allowing GDB to output values in a manner consistent with the syntax of your program's native language. The language you use to build expressions is called the working language.
Setting Switching between source languages Show Displaying the language Checks Type and range checks Support Supported languages
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are two ways to control the working language--either have GDB
set it automatically, or select it manually yourself. You can use the
set language
command for either purpose. On startup, GDB
defaults to setting the language automatically. The working language is
used to determine how expressions you type are interpreted, how values
are printed, etc.
In addition to the working language, every source file that
GDB knows about has its own working language. For some object
file formats, the compiler might indicate which language a particular
source file is in. However, most of the time GDB infers the
language from the name of the file. The language of a source file
controls whether C++ names are demangled--this way backtrace
can
show each frame appropriately for its own language. There is no way to
set the language of a source file from within GDB, but you can
set the language associated with a filename extension. See Show.
This is most commonly a problem when you use a program, such
as cfront
or f2c
, that generates C but is written in
another language. In that case, make the
program use #line
directives in its C output; that way
GDB will know the correct language of the source code of the original
program, and will display that source code, not the generated C code.
Filenames Filename extensions and languages. Manually Setting the working language manually Automatically Having GDB infer the source language
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If a source file name ends in one of the following extensions, then GDB infers that its language is the one indicated.
In addition, you may set the language associated with a filename extension. See Show.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you allow GDB to set the language automatically, expressions are interpreted the same way in your debugging session and your program.
If you wish, you may set the language manually. To do this, issue the
command `set language lang', where lang is the name of
a language, such as
c
or modula-2
.
For a list of the supported languages, type `set language'.
Setting the language manually prevents GDB from updating the working language automatically. This can lead to confusion if you try to debug a program when the working language is not the same as the source language, when an expression is acceptable to both languages--but means different things. For instance, if the current source file were written in C, and GDB was parsing Modula-2, a command such as:
print a = b + cmight not have the effect you intended. In C, this means to add
b
and c
and place the result in a
. The result
printed would be the value of a
. In Modula-2, this means to compare
a
to the result of b+c
, yielding a BOOLEAN
value.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To have GDB set the working language automatically, use `set language local' or `set language auto'. GDB then infers the working language. That is, when your program stops in a frame (usually by encountering a breakpoint), GDB sets the working language to the language recorded for the function in that frame. If the language for a frame is unknown (that is, if the function or block corresponding to the frame was defined in a source file that does not have a recognized extension), the current working language is not changed, and GDB issues a warning.
This may not seem necessary for most programs, which are written entirely in one source language. However, program modules and libraries written in one source language can be used by a main program written in a different source language. Using `set language auto' in this case frees you from having to set the working language manually.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following commands help you find out which language is the working language, and also what language source files were written in.
show language
print
to
build and compute expressions that may involve variables in your program.
info frame
info source
In unusual circumstances, you may have source files with extensions not in the standard list. You can then set the extension associated with a language explicitly:
set extension-language .ext language
info extensions
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Warning: In this release, the GDB commands for type and range checking are included, but they do not yet have any effect. This section documents the intended facilities.Some languages are designed to guard you against making seemingly common errors through a series of compile- and run-time checks. These include checking the type of arguments to functions and operators, and making sure mathematical overflows are caught at run time. Checks such as these help to ensure a program's correctness once it has been compiled by eliminating type mismatches, and providing active checks for range errors when your program is running.
GDB can check for conditions like the above if you wish.
Although GDB does not check the statements in your program, it
can check expressions entered directly into GDB for evaluation via
the print
command, for example. As with the working language,
GDB can also decide whether or not to check automatically based on
your program's source language. See Support,
for the default settings of supported languages.
Type Checking An overview of type checking Range Checking An overview of range checking
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some languages, such as Modula-2, are strongly typed, meaning that the arguments to operators and functions have to be of the correct type, otherwise an error occurs. These checks prevent type mismatch errors from ever causing any run-time problems. For example,
1 + 2 => 3
but
error--> 1 + 2.3
The second example fails because the CARDINAL
1 is not
type-compatible with the REAL
2.3.
For the expressions you use in GDB commands, you can tell the GDB type checker to skip checking; to treat any mismatches as errors and abandon the expression; or to only issue warnings when type mismatches occur, but evaluate the expression anyway. When you choose the last of these, GDB evaluates expressions like the second example above, but also issues a warning.
Even if you turn type checking off, there may be other reasons
related to type that prevent GDB from evaluating an expression.
For instance, GDB does not know how to add an int
and
a struct foo
. These particular type errors have nothing to do
with the language in use, and usually arise from expressions, such as
the one described above, which make little sense to evaluate anyway.
Each language defines to what degree it is strict about type. For instance, both Modula-2 and C require the arguments to arithmetical operators to be numbers. In C, enumerated types and pointers can be represented as numbers, so that they are valid arguments to mathematical operators. See Support, for further details on specific languages.
GDB provides some additional commands for controlling the type checker:
set check type auto
set check type on
set check type off
set check type warn
show type
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In some languages (such as Modula-2), it is an error to exceed the bounds of a type; this is enforced with run-time checks. Such range checking is meant to ensure program correctness by making sure computations do not overflow, or indices on an array element access do not exceed the bounds of the array.
For expressions you use in GDB commands, you can tell GDB to treat range errors in one of three ways: ignore them, always treat them as errors and abandon the expression, or issue warnings but evaluate the expression anyway.
A range error can result from numerical overflow, from exceeding an array index bound, or when you type a constant that is not a member of any type. Some languages, however, do not treat overflows as an error. In many implementations of C, mathematical overflow causes the result to "wrap around" to lower values--for example, if m is the largest integer value, and s is the smallest, then
m + 1 => sThis, too, is specific to individual languages, and in some cases specific to individual compilers or machines. See Support, for further details on specific languages.
GDB provides some additional commands for controlling the range checker:
set check range auto
set check range on
set check range off
set check range warn
show range
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB supports C, C++, Fortran, Java, Chill, assembly, and Modula-2.
Fortran for specific information about Fortran.
Some GDB features may be used in expressions regardless of the
language you use: the GDB @
and ::
operators,
and the `{type}addr' construct (see Expressions) can be used with the constructs of any supported
language.
The following sections detail to what degree each source language is supported by GDB. These sections are not meant to be language tutorials or references, but serve only as a reference guide to what the GDB expression parser accepts, and what input and output formats should look like for different languages. There are many good books written on each of these languages; please look to these for a language reference or tutorial.
C C and C++ Modula-2 Modula-2 Chill Chill Fortran Fortran
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Since C and C++ are so closely related, many features of GDB apply to both languages. Whenever this is the case, we discuss those languages together.
The C++ debugging facilities are jointly implemented by the C++
compiler and GDB. Therefore, to debug your C++ code
effectively, you must compile your C++ programs with a supported
C++ compiler, such as GNU g++
, or the HP ANSI C++
compiler (aCC
).
For best results when using GNU C++, use the stabs debugging
format. You can select that format explicitly with the g++
command-line options `-gstabs' or `-gstabs+'. See
section `Options for Debugging Your Program or GNU CC' in Using GNU CC, for more information.
C Operators C and C++ operators C Constants C and C++ constants C plus plus expressions C++ expressions C Defaults Default settings for C and C++ C Checks C and C++ type and range checks Debugging C GDB and C Debugging C plus plus GDB features for C++
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Operators must be defined on values of specific types. For instance,
+
is defined on numbers, but not on structures. Operators are
often defined on groups of types.
For the purposes of C and C++, the following definitions hold:
int
with any of its storage-class
specifiers; char
; enum
; and, for C++, bool
.
float
, double
, and
long double
(if supported by the target platform).
(type *)
.
,
=
op=
a op= b
,
and translated to a = a op b
.
op=
and =
have the same precedence.
op is any one of the operators |
, ^
, &
,
<<
, >>
, +
, -
, *
, /
, %
.
?:
a ? b : c
can be thought
of as: if a then b else c. a should be of an
integral type.
||
&&
|
^
&
==, !=
<, >, <=, >=
<<, >>
@
+, -
*, /, %
++, --
*
++
.
&
++
.
For debugging C++, GDB implements a use of `&' beyond what is allowed in the C++ language itself: you can use `&(&ref)' (or, if you prefer, simply `&&ref') to examine the address where a C++ reference variable (declared with `&ref') is stored.
-
++
.
!
++
.
~
++
.
., ->
struct
and union
data.
.*, ->*
[]
a[i]
is defined as
*(a+i)
. Same precedence as ->
.
()
->
.
::
struct
, union
,
and class
types.
::
::
,
above.
9.4.1.2 C and C++ constants
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB allows you to express the constants of C and C++ in the following ways:
long
value.
float
(as opposed to the default double
) type; or with
a letter `l' or `L', which specifies a long double
constant.
'
), or a number--the ordinal value of the corresponding character
(usually its ASCII value). Within quotes, the single character may
be represented by a letter or by escape sequences, which are of
the form `\nnn', where nnn is the octal representation
of the character's ordinal value; or of the form `\x', where
`x' is a predefined special character--for example,
`\n' for newline.
"
).
9.4.1.3 C++ expressions 9.4.1.4 C and C++ defaults 9.4.1.5 C and C++ type and range checks 9.4.1.6 GDB and C
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB expression handling can interpret most C++ expressions.
Warning: GDB can only debug C++ code if you use the proper compiler. Typically, C++ debugging depends on the use of additional debugging information in the symbol table, and thus requires special support. In particular, if your compiler generates a.out, MIPS ECOFF, RS/6000 XCOFF, or ELF with stabs extensions to the symbol table, these facilities are all available. (With GNU CC, you can use the `-gstabs' option to request stabs debugging extensions explicitly.) Where the object code format is standard COFF or DWARF in ELF, on the other hand, most of the C++ support in GDB does not work.
count = aml->GetOriginal(x, y)
this
following the same rules as C++.
It does perform integral conversions and promotions, floating-point promotions, arithmetic conversions, pointer conversions, conversions of class objects to base classes, and standard conversions such as those of functions or arrays to pointers; it requires an exact match on the number of function arguments.
Overload resolution is always performed, unless you have specified
set overload-resolution off
. See Debugging C plus plus.
You must specify set overload-resolution off
in order to use an
explicit function signature to call an overloaded function, as in
p 'foo(char,int)'('x', 13)
The GDB command-completion facility can simplify this;
see Completion.
In the parameter list shown when GDB displays a frame, the values of reference variables are not displayed (unlike other variables); this avoids clutter, since references are often used for large structures. The address of a reference variable is always shown, unless you have specified `set print address off'.
::
---your
expressions can use it just as expressions in your program do. Since
one scope may be defined in another, you can use ::
repeatedly if
necessary, for example in an expression like
`scope1::scope2::name'. GDB also allows
resolving name scope by reference to source files, in both C and C++
debugging (see Variables).
In addition, when used with HP's C++ compiler, GDB supports calling virtual functions correctly, printing out virtual bases of objects, calling functions in a base subobject, casting objects, and invoking user-defined operators.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you allow GDB to set type and range checking automatically, they
both default to off
whenever the working language changes to
C or C++. This happens regardless of whether you or GDB
selects the working language.
If you allow GDB to set the language automatically, it recognizes source files whose names end with `.c', `.C', or `.cc', etc, and when GDB enters code compiled from one of these files, it sets the working language to C or C++. See Automatically, for further details.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, when GDB parses C or C++ expressions, type checking is not used. However, if you turn type checking on, GDB considers two variables type equivalent if:
typedef
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The set print union
and show print union
commands apply to
the union
type. When set to `on', any union
that is
inside a struct
or class
is also printed. Otherwise, it
appears as `{...}'.
The @
operator aids in the debugging of dynamic arrays, formed
with pointers and a memory allocation function. See Expressions.
9.4.1.7 GDB features for C++
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some GDB commands are particularly useful with C++, and some are designed specifically for use with C++. Here is a summary:
breakpoint menus
rbreak regex
catch throw
catch catch
ptype typename
set print demangle
show print demangle
set print asm-demangle
show print asm-demangle
set print object
show print object
set print vtbl
show print vtbl
vtbl
commands do not work on programs compiled with the HP
ANSI C++ compiler (aCC
).)
set overload-resolution on
set overload-resolution off
show overload-resolution
Overloaded symbol names
symbol(types)
rather than just symbol. You can
also use the GDB command-line word completion facilities to list the
available choices, or to finish the type list for you.
See Completion, for details on how to do this.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The extensions made to GDB to support Modula-2 only support output from the GNU Modula-2 compiler (which is currently being developed). Other Modula-2 compilers are not currently supported, and attempting to debug executables produced by them is most likely to give an error as GDB reads in the executable's symbol table.
M2 Operators Built-in operators Built-In Func/Proc Built-in functions and procedures M2 Constants Modula-2 constants M2 Defaults Default settings for Modula-2 Deviations Deviations from standard Modula-2 M2 Checks Modula-2 type and range checks M2 Scope The scope operators ::
and.
GDB/M2 GDB and Modula-2
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Operators must be defined on values of specific types. For instance,
+
is defined on numbers, but not on structures. Operators are
often defined on groups of types. For the purposes of Modula-2, the
following definitions hold:
INTEGER
, CARDINAL
, and
their subranges.
CHAR
and its subranges.
REAL
.
POINTER TO
type
.
SET
and BITSET
types.
BOOLEAN
.
,
:=
:=
value is
value.
<, >
<=, >=
<
.
=, <>, #
<
. In GDB scripts, only <>
is
available for inequality, since #
conflicts with the script
comment character.
IN
<
.
OR
AND, &
@
+, -
*
/
*
.
DIV, MOD
*
.
-
INTEGER
and REAL
data.
^
NOT
^
.
.
RECORD
field selector. Defined on RECORD
data. Same
precedence as ^
.
[]
ARRAY
data. Same precedence as ^
.
()
PROCEDURE
objects. Same precedence
as ^
.
::, .
Warning: Sets and their operations are not yet supported, so GDB treats the use of the operatorIN
, or the use of operators+
,-
,*
,/
,=
, ,<>
,#
,<=
, and>=
on sets as an error.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Modula-2 also makes available several built-in procedures and functions. In describing these, the following metavariables are used:
ARRAY
variable.
CHAR
constant or variable.
SET OF mtype
(where mtype is the type of m).
All Modula-2 built-in procedures also return a result, described below.
ABS(n)
CAP(c)
CHR(i)
DEC(v)
DEC(v,i)
EXCL(m,s)
FLOAT(i)
HIGH(a)
INC(v)
INC(v,i)
INCL(m,s)
MAX(t)
MIN(t)
ODD(i)
ORD(x)
SIZE(x)
TRUNC(r)
VAL(t,i)
Warning: Sets and their operations are not yet supported, so GDB treats the use of proceduresINCL
andEXCL
as an error.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB allows you to express the constants of Modula-2 in the following ways:
'
) or double ("
). They may
also be expressed by their ordinal value (their ASCII value, usually)
followed by a `C'.
'
) or double ("
).
Escape sequences in the style of C are also allowed. See C Constants, for a brief explanation of escape
sequences.
TRUE
and
FALSE
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If type and range checking are set automatically by GDB, they
both default to on
whenever the working language changes to
Modula-2. This happens regardless of whether you or GDB
selected the working language.
If you allow GDB to set the language automatically, then entering code compiled from a file whose name ends with `.mod' sets the working language to Modula-2. See Automatically, for further details.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A few changes have been made to make Modula-2 programs easier to debug. This is done primarily via loosening its type strictness:
:=
) returns the value of its right-hand
argument.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Warning: in this release, GDB does not yet perform type or range checking.GDB considers two Modula-2 variables type equivalent if:
TYPE
t1 = t2
statement
Range checking is done on all mathematical operations, assignment, array index bounds, and all built-in functions and procedures.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
::
and .
There are a few subtle differences between the Modula-2 scope operator
(.
) and the GDB scope operator (::
). The two have
similar syntax:
module . id scope :: idwhere scope is the name of a module or a procedure, module the name of a module, and id is any declared identifier within your program, except another module.
Using the ::
operator makes GDB search the scope
specified by scope for the identifier id. If it is not
found in the specified scope, then GDB searches all scopes
enclosing the one specified by scope.
Using the .
operator makes GDB search the current scope for
the identifier specified by id that was imported from the
definition module specified by module. With this operator, it is
an error if the identifier id was not imported from definition
module module, or if id is not an identifier in
module.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some GDB commands have little use when debugging Modula-2 programs.
Five subcommands of set print
and show print
apply
specifically to C and C++: `vtbl', `demangle',
`asm-demangle', `object', and `union'. The first four
apply to C++, and the last to the C union
type, which has no direct
analogue in Modula-2.
The @
operator (see Expressions), while available
with any language, is not useful with Modula-2. Its
intent is to aid the debugging of dynamic arrays, which cannot be
created in Modula-2 as they can in C or C++. However, because an
address can be specified by an integral constant, the construct
`{type}adrexp' is still useful.
In GDB scripts, the Modula-2 inequality operator #
is
interpreted as the beginning of a comment. Use <>
instead.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The extensions made to GDB to support Chill only support output from the GNU Chill compiler. Other Chill compilers are not currently supported, and attempting to debug executables produced by them is most likely to give an error as GDB reads in the executable's symbol table.
This section covers the Chill related topics and the features of GDB which support these topics.
How modes are displayed How modes are displayed Locations Locations and their accesses Values and their Operations Values and their Operations 9.4.3.4 Chill type and range checks 9.4.3.5 Chill defaults
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Chill Datatype- (Mode) support of GDB is directly related with the functionality of the GNU Chill compiler, and therefore deviates slightly from the standard specification of the Chill language. The provided modes are:
Discrete modes:
BYTE, UBYTE, INT,
UINT, LONG, ULONG
,
BOOL
,
CHAR
,
SET
.
(gdb) ptype x type = SET (karli = 10, susi = 20, fritzi = 100)If the type is an unnumbered set the set element values are omitted.
type = <basemode>
(<lower bound> : <upper bound>)
, where <lower bound>, <upper
bound>
can be of any discrete literal expression (e.g. set element
names).
Powerset Mode:
POWERSET
followed by
the member mode of the powerset. The member mode can be any discrete mode.
(gdb) ptype x type = POWERSET SET (egon, hugo, otto)
Reference Modes:
REF
followed by the mode name to which the reference is bound.
PTR
.
Procedure mode
type = PROC(<parameter list>)
<return mode> EXCEPTIONS (<exception list>)
. The <parameter
list>
is a list of the parameter modes. <return mode>
indicates
the mode of the result of the procedure if any. The exceptionlist lists
all possible exceptions which can be raised by the procedure.
Synchronization Modes:
EVENT (<event length>)
,
where (<event length>)
is optional.
BUFFER (<buffer length>)
<buffer element mode>
, where (<buffer length>)
is optional.
Timing Modes:
DURATION
TIME
Real Modes:
REAL
and LONG_REAL
.
String Modes:
CHARS(<string
length>)
, followed by the keyword VARYING
if the String Mode is
a varying mode
BOOLS(<string
length>)
.
Array Mode:
ARRAY(<range>)
followed by the element mode (which may in turn be an array mode).
(gdb) ptype x type = ARRAY (1:42) ARRAY (1:20) SET (karli = 10, susi = 20, fritzi = 100)
Structure Mode
STRUCT(<field
list>)
. The <field list>
consists of names and modes of fields
of the structure. Variant structures have the keyword CASE <field>
OF <variant fields> ESAC
in their field list. Since the current version
of the GNU Chill compiler doesn't implement tag processing (no runtime
checks of variant fields, and therefore no debugging info), the output
always displays all variant fields.
(gdb) ptype str type = STRUCT ( as x, bs x, CASE bs OF (karli): cs a (ott): ds x ESAC )
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A location in Chill is an object which can contain values.
A value of a location is generally accessed by the (declared) name of the location. The output conforms to the specification of values in Chill programs. How values are specified is the topic of the next section, Values and their Operations.
The pseudo-location RESULT
(or result
) can be used to
display or change the result of a currently-active procedure:
set result := EXPR
This does the same as the Chill action RESULT EXPR
(which
is not available in GDB).
Values of reference mode locations are printed by PTR(<hex
value>)
in case of a free reference mode, and by (REF <reference
mode>) (<hex-value>)
in case of a bound reference. <hex value>
represents the address where the reference points to. To access the
value of the location referenced by the pointer, use the dereference
operator `->'.
Values of procedure mode locations are displayed by { PROC
(<argument modes> ) <return mode> } <address> <name of procedure
location>
. <argument modes>
is a list of modes according to the
parameter specification of the procedure and <address>
shows the
address of the entry point.
Substructures of string mode-, array mode- or structure mode-values (e.g. array slices, fields of structure locations) are accessed using certain operations which are described in the next section, Values and their Operations.
A location value may be interpreted as having a different mode using the
location conversion. This mode conversion is written as <mode
name>(<location>)
. The user has to consider that the sizes of the modes
have to be equal otherwise an error occurs. Furthermore, no range
checking of the location against the destination mode is performed, and
therefore the result can be quite confusing.
(gdb) print int (s(3 up 4)) XXX TO be filled in !! XXX
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Values are used to alter locations, to investigate complex structures in more detail or to filter relevant information out of a large amount of data. There are several (mode dependent) operations defined which enable such investigations. These operations are not only applicable to constant values but also to locations, which can become quite useful when debugging complex structures. During parsing the command line (e.g. evaluating an expression) GDB treats location names as the values behind these locations.
This section describes how values have to be specified and which operations are legal to be used with such values.
Literal Values
Tuple Values
<mode name>[<tuple>]
, where <mode
name>
can be omitted if the mode of the tuple is unambiguous. This
unambiguity is derived from the context of a evaluated expression.
<tuple>
can be one of the following:
String Element Value
<string value>(<index>)
,
where <index>
is a integer expression. It delivers a character
value which is equivalent to the character indexed by <index>
in
the string.
String Slice Value
<string value>(<slice
spec>)
, where <slice spec>
can be either a range of integer
expressions or specified by <start expr> up <size>
.
<size>
denotes the number of elements which the slice contains.
The delivered value is a string value, which is part of the specified
string.
Array Element Values
<array value>(<expr>)
and
delivers a array element value of the mode of the specified array.
Array Slice Values
<array value>(<slice spec>)
, where
<slice spec>
can be either a range specified by expressions or by
<start expr> up <size>
. <size>
denotes the number of
arrayelements the slice contains. The delivered value is an array value
which is part of the specified array.
Structure Field Values
<structure value>.<field
name>
, where <field name>
indicates the name of a field specified
in the mode definition of the structure. The mode of the delivered value
corresponds to this mode definition in the structure definition.
Procedure Call Value
Values of duration mode locations are represented by ULONG
literals.
Values of time mode locations are represented by TIME(<secs>:<nsecs>)
.
Zero-adic Operator Value
Expression Values
OR, ORIF, XOR
AND, ANDIF
NOT
=, /=
>, >=
<, <=
+, -
*, /, MOD, REM
-
//
()
->
->loc
), or to dereference a reference
location (loc->
).
OR, XOR
AND
NOT
>, >=
<, <=
IN
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB considers two Chill variables mode equivalent if the sizes of the two modes are equal. This rule applies recursively to more complex datatypes which means that complex modes are treated equivalent if all element modes (which also can be complex modes like structures, arrays, etc.) have the same size.
Range checking is done on all mathematical operations, assignment, array index bounds and all built in procedures.
Strong type checks are forced using the GDB command set
check strong
. This enforces strong type and range checks on all
operations where Chill constructs are used (expressions, built in
functions, etc.) in respect to the semantics as defined in the z.200
language specification.
All checks can be disabled by the GDB command set check
off
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If type and range checking are set automatically by GDB, they
both default to on
whenever the working language changes to
Chill. This happens regardless of whether you or GDB
selected the working language.
If you allow GDB to set the language automatically, then entering code compiled from a file whose name ends with `.ch' sets the working language to Chill. See Automatically, for further details.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use HP WDB 2.0 to debug programs written in Fortran. HP WDB 2.0 does not distinguish between Fortran 77 and Fortran 90 files.
HP WDB 2.0 includes an option to control case sensitivity.
case-sensitive [on | off]
Other supported features are:
Fortran types Supported data types Fortran operators Supported operators Fortran issues Special issues with Fortran
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
integer*1, integer*2, integer*4, integer*8
logical*1, logical*2, logical*4, logical*8
byte
real*4, real*8, real*16
complex*8, complex*16
character*len, character*(*) [len is a user supplied length]
arrays
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following operators are supported. They are listed here in order of increasing precedence:
=
*, -, *, /
+, -
**
.EQ., =
.NE., /=
.LT., <
.LE., <=
.GT., >
.GE., >=
//
.NOT.
.AND.
.OR.
.EQV.
.NEQV., .XOR.
GDB includes support for viewing Fortran common blocks.
info common
info common <common_block_name>
Fortran entry points are supported.
You can set a break point specifying an entry point name.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Fortran allows main
to be a non-main
procedure, therefore
to set a breakpoint in the main program, use break _MAIN_
or
break <program_name>
.
Do not use break main
unless it is the name of a non-main
procedure.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The commands described in this chapter allow you to inquire about the symbols (names of variables, functions and types) defined in your program. This information is inherent in the text of your program and does not change as your program executes. GDB finds it in your program's symbol table, in the file indicated when you started GDB (see File Options), or by one of the file-management commands (see Files).
Occasionally, you may need to refer to symbols that contain unusual characters, which GDB ordinarily treats as word delimiters. The most frequent case is in referring to static variables in other source files (see Variables). File names are recorded in object files as debugging symbols, but GDB would ordinarily parse a typical file name, like `foo.c', as the three words `foo' `.' `c'. To allow GDB to recognize `foo.c' as a single symbol, enclose it in single quotes; for example,
p 'foo.c'::xlooks up the value of
x
in the scope of the file `foo.c'.
info address symbol
Note the contrast with `print &symbol', which does not work at all for a register variable, and for a stack local variable prints the exact address of the current instantiation of the variable.
whatis expr
whatis
$
, the last value in the value history.
ptype typename
ptype expr
ptype
ptype
differs from whatis
by printing a detailed description, instead
of just the name of the type.
For example, for this variable declaration:
struct complex {double real; double imag;} v;the two commands give this output:
(gdb) whatis v type = struct complex (gdb) ptype v type = struct complex { double real; double imag; }As with
whatis
, using ptype
without an argument refers to
the type of $
, the last value in the value history.
info types regexp
info types
value
, but `i type ^value$' gives
information only on types whose complete name is value
.
This command differs from ptype
in two ways: first, like
whatis
, it does not print a detailed description; second, it
lists all source files where a type is defined.
info source
info sources
info functions
info functions regexp
step
; `info fun ^step' finds those whose names
start with step
.
info variables
info variables regexp
Some systems allow individual object files that make up your program to be replaced without stopping and restarting your program. For example, in VxWorks you can simply recompile a defective object file and keep on running. If you are running on one of these systems, you can allow GDB to reload the symbols for automatically relinked modules:
set symbol-reloading on
set symbol-reloading off
symbol-reloading
off, since otherwise GDB may discard symbols
when linking large programs, that may contain several modules (from
different directories or libraries) with the same name.
show symbol-reloading
on
or off
setting.
set opaque-type-resolution on
struct
, class
, or
union
---for example, struct MyType *
---that is used in one
source file although the full declaration of struct MyType
is in
another source file. The default is on.
A change in the setting of this subcommand will not take effect until the next time symbols for a file are loaded.
set opaque-type-resolution off
{<no data fields>}
show opaque-type-resolution
maint print symbols filename
maint print psymbols filename
maint print msymbols filename
info sources
to find out which files these are. If you
use `maint print psymbols' instead, the dump shows information about
symbols that GDB only knows partially--that is, symbols defined in
files that GDB has skimmed, but not yet read completely. Finally,
`maint print msymbols' dumps just the minimal symbol information
required for each object file from which GDB has read some symbols.
See Files, for a discussion of how
GDB reads symbols (in the description of symbol-file
).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Once you think you have found an error in your program, you might want to find out for certain whether correcting the apparent error would lead to correct results in the rest of the run. You can find the answer by experiment, using the GDB features for altering execution of the program.
For example, you can store new values into variables or memory locations, give your program a signal, restart it at a different address, or even return prematurely from a function.
Assignment Assignment to variables Jumping Continuing at a different address Signaling Giving your program a signal Returning Returning from a function Calling Calling your program's functions Patching Patching your program
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To alter the value of a variable, evaluate an assignment expression. See Expressions. For example,
print x=4stores the value 4 into the variable
x
, and then prints the
value of the assignment expression (which is 4).
See Languages, for more
information on operators in supported languages.
If you are not interested in seeing the value of the assignment, use the
set
command instead of the print
command. set
is
really the same as print
except that the expression's value is
not printed and is not put in the value history (see Value History). The expression is evaluated only for its effects.
If the beginning of the argument string of the set
command
appears identical to a set
subcommand, use the set
variable
command instead of just set
. This command is identical
to set
except for its lack of subcommands. For example, if your
program has a variable width
, you get an error if you try to set
a new value with just `set width=13', because GDB has the
command set width
:
(gdb) whatis width type = double (gdb) p width $4 = 13 (gdb) set width=47 Invalid syntax in expression.The invalid expression, of course, is `=47'. In order to actually set the program's variable
width
, use
(gdb) set var width=47Because the
set
command has many subcommands that can conflict
with the names of program variables, it is a good idea to use the
set variable
command instead of just set
. For example, if
your program has a variable g
, you run into problems if you try
to set a new value with just `set g=4', because GDB has
the command set gnutarget
, abbreviated set g
:
(gdb) whatis g type = double (gdb) p g $1 = 1 (gdb) set g=4 (gdb) p g $2 = 1 (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/smith/cc_progs/a.out "/home/smith/cc_progs/a.out": can't open to read symbols: Invalid bfd target. (gdb) show g The current BFD target is "=4".The program variable
g
did not change, and you silently set the
gnutarget
to an invalid value. In order to set the variable
g
, use
(gdb) set var g=4GDB allows more implicit conversions in assignments than C; you can freely store an integer value into a pointer variable or vice versa, and you can convert any structure to any other structure that is the same length or shorter.
To store values into arbitrary places in memory, use the `{...}'
construct to generate a value of specified type at a specified address
(see Expressions). For example, {int}0x83040
refers
to memory location 0x83040
as an integer (which implies a certain size
and representation in memory), and
set {int}0x83040 = 4stores the value 4 into that memory location.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Ordinarily, when you continue your program, you do so at the place where
it stopped, with the continue
command. You can instead continue at
an address of your own choosing, with the following commands:
jump linespec
tbreak
command
in conjunction with jump
. See Set Breaks.
The jump
command does not change the current stack frame, or
the stack pointer, or the contents of any memory location or any
register other than the program counter. If line linespec is in
a different function from the one currently executing, the results may
be bizarre if the two functions expect different patterns of arguments or
of local variables. For this reason, the jump
command requests
confirmation if the specified line is not in the function currently
executing. However, even bizarre results are predictable if you are
well acquainted with the machine-language code of your program.
jump *address
On many systems, you can get much the same effect as the jump
command by storing a new value into the register $pc
. The
difference is that this does not start your program running; it only
changes the address of where it will run when you continue. For
example,
set $pc = 0x485makes the next
continue
command or stepping command execute at
address 0x485
, rather than at the address where your program stopped.
See Continuing and Stepping.
The most common occasion to use the jump
command is to back
up--perhaps with more breakpoints set--over a portion of a program
that has already executed, in order to examine its execution in more
detail.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
signal signal
signal 2
and signal
SIGINT
are both ways of sending an interrupt signal.
Alternatively, if signal is zero, continue execution without
giving a signal. This is useful when your program stopped on account of
a signal and would ordinary see the signal when resumed with the
continue
command; `signal 0' causes it to resume without a
signal.
signal
does not repeat when you press RET a second time
after executing the command.
Invoking the signal
command is not the same as invoking the
kill
utility from the shell. Sending a signal with kill
causes GDB to decide what to do with the signal depending on
the signal handling tables (see Signals). The signal
command
passes the signal directly to your program.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
return
return expression
return
command. If you give an
expression argument, its value is used as the function's return
value.
When you use return
, GDB discards the selected stack frame
(and all frames within it). You can think of this as making the
discarded frame return prematurely. If you wish to specify a value to
be returned, give that value as the argument to return
.
This pops the selected stack frame (see Selection), and any other frames inside of it, leaving its caller as the innermost remaining frame. That frame becomes selected. The specified value is stored in the registers used for returning values of functions.
The return
command does not resume execution; it leaves the
program stopped in the state that would exist if the function had just
returned. In contrast, the finish
command (see Continuing and Stepping) resumes execution until the
selected stack frame returns naturally.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
call expr
void
returned values.
You can use this variant of the print
command if you want to
execute a function from your program, but without cluttering the output
with void
returned values. If the result is not void, it
is printed and saved in the value history.
For the A29K, a user-controlled variable call_scratch_address
,
specifies the location of a scratch area to be used when GDB
calls a function in the target. This is necessary because the usual
method of putting the scratch area on the stack does not work in systems
that have separate instruction and data spaces.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, GDB opens the file containing your program's executable code (or the core file) read-only. This prevents accidental alterations to machine code; but it also prevents you from intentionally patching your program's binary.
If you'd like to be able to patch the binary, you can specify that
explicitly with the set write
command. For example, you might
want to turn on internal debugging flags, or even to make emergency
repairs.
set write on
set write off
If you have already loaded a file, you must load it again (using the
exec-file
or core-file
command) after changing set
write
, for your new setting to take effect.
show write
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB needs to know the file name of the program to be debugged, both in order to read its symbol table and in order to start your program. To debug a core dump of a previous run, you must also tell GDB the name of the core dump file.
Files Commands to specify files Symbol Errors Errors reading symbol files
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You may want to specify executable and core dump file names. The usual way to do this is at start-up time, using the arguments to GDB's start-up commands (see Invocation).
Occasionally it is necessary to change to a different file during a GDB session. Or you may run GDB and forget to specify a file you want to use. In these situations the GDB commands to specify new files are useful.
file filename
run
command. If you do not specify a
directory and the file is not found in the GDB working directory,
GDB uses the environment variable PATH
as a list of
directories to search, just as the shell does when looking for a program
to run. You can change the value of this variable, for both GDB
and your program, using the path
command.
On systems with memory-mapped files, an auxiliary file
`filename.syms' may hold symbol table information for
filename. If so, GDB maps in the symbol table from
`filename.syms', starting up more quickly. See the
descriptions of the file options `-mapped' and `-readnow'
(available on the command line, and with the commands file
,
symbol-file
, or add-symbol-file
, described below),
for more information.
file
file
with no argument makes GDB discard any information it
has on both executable file and the symbol table.
exec-file [ filename ]
PATH
if necessary to locate your program. Omitting filename means to
discard information on the executable file.
symbol-file [ filename ]
PATH
is
searched when necessary. Use the file
command to get both symbol
table and program to run from the same file.
symbol-file
with no argument clears out GDB information on your
program's symbol table.
The symbol-file
command causes GDB to forget the contents
of its convenience variables, the value history, and all breakpoints and
auto-display expressions. This is because they may contain pointers to
the internal data recording symbols and data types, which are part of
the old symbol table data being discarded inside GDB.
symbol-file
does not repeat if you press RET again after
executing it once.
When GDB is configured for a particular environment, it understands debugging information in whatever format is the standard generated for that environment; you may use either a GNU compiler, or other compilers that adhere to the local conventions.
For most kinds of object files, with the exception of old SVR3 systems
using COFF, the symbol-file
command does not normally read the
symbol table in full right away. Instead, it scans the symbol table
quickly to find which source files and which symbols are present. The
details are read later, one source file at a time, as they are needed.
The purpose of this two-stage reading strategy is to make GDB
start up faster. For the most part, it is invisible except for
occasional pauses while the symbol table details for a particular source
file are being read. (The set verbose
command can turn these
pauses into messages if desired. See Messages/Warnings.)
We have not implemented the two-stage strategy for COFF yet. When the
symbol table is stored in COFF format, symbol-file
reads the
symbol table data in full right away. Note that "stabs-in-COFF"
still does the two-stage strategy, since the debug info is actually
in stabs format.
symbol-file filename [ -readnow ] [ -mapped ]
file filename [ -readnow ] [ -mapped ]
If memory-mapped files are available on your system (usually not Unix systems,
through the mmap
system call, you can use another option, `-mapped',
to cause GDB to write the symbols for your program into a reusable
file. Future GDB debugging sessions map in symbol information
from this auxiliary symbol file (if the program has not changed), rather
than spending time reading the symbol table from the executable
program. Using the `-mapped' option has the same effect as
starting GDB with the `-mapped' command-line option.
You can use both options together, to make sure the auxiliary symbol file has all the symbol information for your program.
The auxiliary symbol file for a program called myprog is called `myprog.syms'. Once this file exists (so long as it is newer than the corresponding executable), GDB always attempts to use it when you debug myprog; no special options or commands are needed.
The `.syms' file is specific to the host machine where you run GDB. It holds an exact image of the internal GDB symbol table. It cannot be shared across multiple host platforms.
core-file [ filename ]
core-file
with no argument specifies that no core file is
to be used.
Note that the core file is ignored when your program is actually running
under GDB. So, if you have been running your program and you
wish to debug a core file instead, you must kill the subprocess in which
the program is running. To do this, use the kill
command
(see Kill Process).
add-symbol-file filename address
add-symbol-file filename address [ -readnow ] [ -mapped ]
add-symbol-file filename address data_address bss_address
add-symbol-file filename -Tsection address
add-symbol-file
command reads additional symbol table information
from the file filename. You would use this command when filename
has been dynamically loaded (by some other means) into the program that
is running. address should be the memory address at which the
file has been loaded; GDB cannot figure this out for itself.
You can specify up to three addresses, in which case they are taken to be
the addresses of the text, data, and bss segments respectively.
For complicated cases, you can specify an arbitrary number of -Tsection address
pairs, to give an explicit section name and base address for that section.
You can specify any address as an expression.
The symbol table of the file filename is added to the symbol table
originally read with the symbol-file
command. You can use the
add-symbol-file
command any number of times; the new symbol data thus
read keeps adding to the old. To discard all old symbol data instead,
use the symbol-file
command.
add-symbol-file
does not repeat if you press RET after using it.
You can use the `-mapped' and `-readnow' options just as with
the symbol-file
command, to change how GDB manages the symbol
table information for filename.
add-shared-symbol-file
add-shared-symbol-file
command can be used only under Harris' CXUX
operating system for the Motorola 88k. GDB automatically looks for
shared libraries, however if GDB does not find yours, you can run
add-shared-symbol-file
. It takes no arguments.
section
section
command changes the base address of section SECTION of
the exec file to ADDR. This can be used if the exec file does not contain
section addresses, (such as in the a.out format), or when the addresses
specified in the file itself are wrong. Each section must be changed
separately. The info files
command, described below, lists all
the sections and their addresses.
info files
info target
info files
and info target
are synonymous; both print the
current target (see Targets),
including the names of the executable and core dump files currently in
use by GDB, and the files from which symbols were loaded. The
command help target
lists all possible targets rather than
current ones.
All file-specifying commands allow both absolute and relative file names as arguments. GDB always converts the file name to an absolute file name and remembers it that way.
GDB supports HP-UX, SunOS, SVR4, Irix 5, and IBM RS/6000 shared libraries.
GDB automatically loads symbol definitions from shared libraries
when you use the run
command, or when you examine a core file.
(Before you issue the run
command, GDB does not understand
references to a function in a shared library, however--unless you are
debugging a core file).
On HP-UX, if the program loads a library explicitly, GDB
automatically loads the symbols at the time of the shl_load
call.
See Breakpoints,
for more information.
info share
info sharedlibrary
sharedlibrary regex
share regex
run
. If
regex is omitted all shared libraries required by your program are
loaded.
On HP-UX systems, GDB detects the loading of a shared library and automatically reads in symbols from the newly loaded library, up to a threshold that is initially set but that you can modify if you wish.
Beyond that threshold, symbols from shared libraries must be explicitly
loaded. To load these symbols, use the command sharedlibrary
filename
. The base address of the shared library is determined
automatically by GDB and need not be specified.
To display or set the threshold, use the commands:
set auto-solib-add threshold
sharedlibrary
command. The default threshold is 100 megabytes.
show auto-solib-add
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
While reading a symbol file, GDB occasionally encounters problems,
such as symbol types it does not recognize, or known bugs in compiler
output. By default, GDB does not notify you of such problems, since
they are relatively common and primarily of interest to people
debugging compilers. If you are interested in seeing information
about ill-constructed symbol tables, you can either ask GDB to print
only one message about each such type of problem, no matter how many
times the problem occurs; or you can ask GDB to print more messages,
to see how many times the problems occur, with the set
complaints
command (see Messages/Warnings).
The messages currently printed, and their meanings, include:
inner block not inside outer block in symbol
GDB circumvents the problem by treating the inner block as if it had
the same scope as the outer block. In the error message, symbol
may be shown as "(don't know)
" if the outer block is not a
function.
block at address out of order
GDB does not circumvent this problem, and has trouble
locating symbols in the source file whose symbols it is reading. (You
can often determine what source file is affected by specifying
set verbose on
. See Messages/Warnings.)
bad block start address patched
GDB circumvents the problem by treating the symbol scope block as starting on the previous source line.
bad string table offset in symbol n
GDB circumvents the problem by considering the symbol to have the
name foo
, which may cause other problems if many symbols end up
with this name.
unknown symbol type 0xnn
0xnn
is the symbol type of the
uncomprehended information, in hexadecimal.
GDB circumvents the error by ignoring this symbol information.
This usually allows you to debug your program, though certain symbols
are not accessible. If you encounter such a problem and feel like
debugging it, you can debug gdb
with itself, breakpoint
on complain
, then go up to the function read_dbx_symtab
and examine *bufp
to see the symbol.
stub type has NULL name
const/volatile indicator missing (ok if using g++ v1.x), got...
info mismatch between compiler and debugger
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A target is the execution environment occupied by your program.
Often, GDB runs in the same host environment as your program;
in that case, the debugging target is specified as a side effect when
you use the file
or core
commands. For HP-UX specific
information, See HP-UX Targets. When you need more
flexibility--for example, running GDB on a physically separate
host, or controlling a standalone system over a serial port or a
realtime system over a TCP/IP connection--you can use the target
command to specify one of the target types configured for GDB
(see Target Commands).
Active Targets Active targets Target Commands Commands for managing targets Byte Order Choosing target byte order
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are three classes of targets: processes, core files, and executable files. GDB can work concurrently on up to three active targets, one in each class. This allows you to (for example) start a process and inspect its activity without abandoning your work on a core file.
For example, if you execute `gdb a.out', then the executable file
a.out
is the only active target. If you designate a core file as
well--presumably from a prior run that crashed and core dumped--then
GDB has two active targets and uses them in tandem, looking
first in the core file target, then in the executable file, to satisfy
requests for memory addresses. (Typically, these two classes of target
are complementary, since core files contain only a program's
read-write memory--variables and so on--plus machine status, while
executable files contain only the program text and initialized data.)
When you type run
, your executable file becomes an active process
target as well. When a process target is active, all GDB
commands requesting memory addresses refer to that target; addresses in
an active core file or executable file target are obscured while the
process target is active.
Use the core-file
and exec-file
commands to select a new
core file or executable target (see Files). To specify as a target a process that is already running, use
the attach
command (see Attach).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
target type parameters
Further parameters are interpreted by the target protocol, but typically include things like device names or host names to connect with, process numbers, and baud rates.
The target
command does not repeat if you press RET again
after executing the command.
help target
info target
or info files
(see Files).
help target name
set gnutarget args
set gnutarget
command. Unlike most target
commands,
with gnutarget
the target
refers to a program, not a machine.
Warning: To specify a file format with set gnutarget
,
you must know the actual BFD name.
See Files.
show gnutarget
show gnutarget
command to display what file format
gnutarget
is set to read. If you have not set gnutarget
,
GDB will determine the file format for each file automatically,
and show gnutarget
displays `The current BDF target is "auto"'.
Here are some common targets (available, or not, depending on the GDB configuration):
target exec program
target core filename
target remote dev
load
command. This is only useful if you have
some other way of getting the stub to the target system, and you can put
it somewhere in memory where it won't get clobbered by the download.
target sim
target sim load runworks; however, you cannot assume that a specific memory map, device drivers, or even basic I/O is available, although some simulators do provide these.
Some configurations may include these targets as well:
target nrom dev
Different targets are available on different configurations of GDB; your configuration may have more or fewer targets.
Many remote targets require you to download the executable's code once you've successfully established a connection.
load filename
load
command may be available. Where it exists, it
is meant to make filename (an executable) available for debugging
on the remote system--by downloading, or dynamic linking, for example.
load
also records the filename symbol table in GDB, like
the add-symbol-file
command.
If your GDB does not have a load
command, attempting to
execute it gets the error message "You can't do that when your
target is ...
"
The file is loaded at whatever address is specified in the executable. For some object file formats, you can specify the load address when you link the program; for other formats, like a.out, the object file format specifies a fixed address.
load
does not repeat if you press RET again after using it.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some types of processors, such as the MIPS, PowerPC, and Hitachi SH, offer the ability to run either big-endian or little-endian byte orders. Usually the executable or symbol will include a bit to designate the endian-ness, and you will not need to worry about which to use. However, you may still find it useful to adjust GDB's idea of processor endian-ness manually.
set endian big
set endian little
set endian auto
show endian
Note that these commands merely adjust interpretation of symbolic data on the host, and that they have absolutely no effect on the target system.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
While nearly all GDB commands are available for all native and cross versions of the debugger, there are some exceptions. This chapter describes things that are only available in certain configurations.
There are three major categories of configurations: native configurations, where the host and target are the same, embedded operating system configurations, which are usually the same for several different processor architectures, and bare embedded processors, which are quite different from each other.
HP WDB 2.0 provides the following features in addition to the standard GDB features:
+objdebug
option. The benefits of this option are only available
if you have installed the most recent linker patch.
-xdb
option.
HP-UX Dependencies Requirements to support HP Features HP-UX Targets Valid targets for HP-UX Fix and Continue Fix and Continue Debugging Debugging Memory Problems Debugging Memory Problems Heap Profiling Heap Profiling Object Paths Specifying Object File Directories Shared library breakpoints Stopping and starting in shared libraries Shared library main Shared library as a main program Non-debug executables Getting information from a non-debug executable
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Several features available in HP WDB 2.0 depend on specific versions of the linker or compilers.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You must install the latest linker patch in order to generate object modules that enable faster linking and smaller executable file sizes for large applications. Refer to the HP WDB 2.0 release notes and your compiler release notes for more details.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SHMEM_MAGIC
.
run
command) or started outside of GDB and attached to
(with the attach
command)
HP WDB 2.0 can only debug programs compiled with HP aC++, HP's ANSI-compatible C++ compiler. You must use HP DDE to debug programs compiled with HP C++, HP's earlier cfront-based C++ compiler.
If you try to debug cfront-compiled programs, HP WDB 2.0 may fail, or produce
confusing results. For example, if you try looking looking at a data member,
HP WDB 2.0 may generate a message about illegally accessing
memory at 0x0
.
You can detect a cfront executable by using the following commands.
On HP PA-RISC 32-bit programs:
odump -compunit executable file nameor
On HP PA-RISC 64-bit programs:
elfdump -dc executableThe cfront compiler emits
HPCPLUSPLUS
while the aCC
compiler
emits ANSI C++
in the compilation directory.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Fix and Continue allows you to see the result of changes you make to a program you are debugging without having to re-compile and re-link the entire program.
For example, you can edit a function and use the fix command, which automatically re-compiles your code, links it into a shared library, and continues execution of the program, without leaving the debugger.
Fix and Continue allows you to experiment with various ways of fixing problems until you are satisfied with the correction, before you exit the debugger.
The advantages include:
Note: Fix and Continue is only supported with the most recent versions of HP C and HP aC++.
In command-line mode, you use the edit
command before invoking the fix
command.
The edit
command has the following syntax:
edit
file1 file2
where
file
The fix
command has the following syntax:
fix
file1 file2
where
file
When you edit a file with the edit command and save the changes, the original source file contains the changes, even if you do not use the fix command to re-compile your program in the debugger.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Fix and Continue has the following restrictions and behaviors:
SIGSEV
error if the pointers are used.
alloca()
function to a frame that did
not previously use alloca()
.
New fields are only accessible by the modified files. Old structure fields remain intact, no swapping of them are permitted.
The modified function will be executed when it is called next time, or a re-run.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When HP WDB 2.0 re-compiles a fixed source file, it uses the same compiler and the same options that were used to create the original executable. If the compiler generates any syntax errors or it encounters any of the restrictions, HP WDB 2.0 does not patch your changes into the executable image being debugged.
After you successfully re-compile your changes, HP WDB 2.0 uses the fixed
version of your code when you use any of the execution commands such as
step
, run
, or continue
.
When you use the edit
command, HP WDB 2.0 then monitors any edited
source files for additional changes. After you enter the initial fix
command, HP WDB 2.0 checks for additional saved changes to a source file
each time you enter a program execution command. If a saved source file has
been changed, HP WDB 2.0 asks you if you want to fix the changed source,
allowing you to apply repeated fixes without explicitly entering the
fix
command.
Note: You must rebuild your program after you use the fix command because the changes you make are temporarily patched into the executable image. The changes are lost if you load a different executable and are not reflected in the original executable when you exit the debugger.The Fix and Continue allows you to make the following changes:
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This example shows how you can make and test changes to a function without leaving the debugger session.
Here is a short sample C program with an error.
int sum (num) int num; { int j, total = 0; for (j = 0; j <= num; j++) total += num; } main() { int num = 10; printf("The sum from 1 to %d is = %d\n", num, sum(num)); }
cc sum.c -g -o mysum /usr/ccs/bin/ld: (Warning) At least one PA 2.0 object file (sum.o) was detected. The linked output may not run on a PA 1.x system.
./mysum The sum from 1 to 10 is = 0This result is obviously wrong. We need to debug the program.
gdb mysum Copyright 1986 - 2000 Free Software Foundation, Inc. Hewlett-Packard Wildebeest 2.0 (based on GDB 4.17-hpwdb-980821) Wildebeest is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for Wildebeest. Type "show warranty" for details. Wildebeest was built for PA-RISC 1.1 or 2.0 (narrow), HP-UX 11.00. ..If your
TERM
environment variable is not set to hpterm, start the
debugger and set the terminal type for editing in HP WDB 2.0 with this
command (ksh shell):
TERM=hpterm gdb mysum
return
for the
num
function. You can correct this without leaving the debugger.
(gdb) b main Breakpoint 1 at 0x23f8: file sum.c, line 11.
(gdb) run Starting program: /tmp/hmc/mysum Breakpoint 1, main () at sum.c:11 11 int num = 10;
edit
command.
Because you are going to edit the current file, you do not need to specify a source file name.
(gdb) editThe edit command opens a new terminal session using your environment variable settings for terminal and editor. The debugger automatically loads the source file.
return total;to the function named
num
.
fix
command to re-compile your program to see the results
of your changes.
(gdb) fix Compiling /dev/src/sum.c... Linking... Applying code changes to sum.c. Fix succeeded.The fix command creates a new executable that includes the changes you made to the source file.
The debugger automatically uses the new executable and picks up the
debugging session where you stopped before using the edit
command.
For example, you can continue stepping through your program and you
will find the new return total;
statement in the source view. You can
print the value of total
, and see that the result is 110.
(gdb) q The following modules in /dev/src/mysum have been fixed: /dev/src/sum.c Remember to remake the program.The debugger message lists the source files that you have changed during your debugging session.
Note: You must rebuild your program after you use the fix
command because the
changes you make are temporarily patched into the executable image. The
changes are lost when you exit the debugger or you load a different
executable.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use HP WDB 2.0 to find leaks, profile heap usage and detect other heap related errors in HP C, HP aC++, and HP Fortran programs written for HP-UX 10.20 or 11.00 (both 32 bit and 64 bit programs are supported).
On HP-UX 11.00, the memory debugging features of HP WDB 2.0 work with both single-threaded and multi-threaded programs that use POSIX threads.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Programs with these attributes are not supported:
EXEC_MAGIC
executables on HP-UX 10.20 or HP-UX 11.00
malloc
package
other than the one from the standard C library, libc.sl
libc.a
, or the core library, libcl.a
,
on both HP-UX 10.20 and HP-UX 11.00
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The commands allow you to:
set heap-check leaks [on | off]
show heap-check
info leaks
info leaks filename
info leak leaknumber
set heap-check block-size num-bytes
set heap-check heap-size num-size
set heap-check frame-count num
set heap-check min-leak-size num
set heap-check free [on | off]
free()
with an improper argument or a call to realloc()
that
does not point to a valid currently allocated heap block.
set heap-check watch address
set heap-check bounds [on | off]
set heap-check scramble [on | off]
malloc()
blocks cause the program to fail.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
HP WDB 2.0 allows you to locate improper calls to free()
and
realloc()
with the command set heap-check free [on | off]
.
With this setting on, whenever your program calls free()
or
realloc()
HP WDB 2.0 inspects the parameters to verify that
they are pointing to valid currently allocated heap blocks.
If HP WDB 2.0 detects an erroneous call to free()
, it stops the
program and reports this condition. You can then look at the stack trace to
understand where and how the problem occurred.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
HP WDB 2.0 allows you to locate problems caused by heap block overflow or
underflow with the command set heap-check bounds [on | off]
. When
bounds checking is turned on, HP WDB 2.0 allocates extra space at the
beginning and end of a block during allocation and fills it up with a specific
pattern. When blocks are freed, HP WDB 2.0 checks to see if these patterns
are intact. If they are corrupted, an underflow or overflow must have
occurred and HP WDB 2.0 reports the problem.
Note:Turning on bounds checking increases the program's memory requirements because the extra guard bytes must be allocated at the beginning and end of each block.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To stop a program whenever a block at a specified address is allocated or deallocated use the command:
set heap-check watch address
You could use this to debug situations such as multiple free()
calls
to the same block.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
HP WDB 2.0 allows you to potentially expose latent memory access defects with
the command set heap-check scramble [on | off]
.
When this setting is turned on, any time a memory block is allocated or deallocated, HP WDB 2.0 scrambles the space and overwrites it with a specific pattern.
This change to the memory contents increases the chance that erroneous
behaviors will cause the program to fail. Examples of such behavior
include, attempting to access space that is freed or
depending on initial values of malloc()
blocks.
You can now look at the stack trace to understand where and how the problem occurred.
Note:Turning on scrambling will slow down the program slightly, because at everymalloc()
andfree()
call, the space involved must be overwritten.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You should suspect a memory leak in your code if you notice your system running out of swap space or running slower and slower, or both.
Applications or non-kernel code (including daemons) that have memory leaks
can eventually use up all swap space. You can run top(1)
to see if your
process data space (SIZE
, RES
) is growing more than you expect.
If your system is running out of swap space, programs will fail with out
of memory (ENOMEM
) errors or SIGBUS
signals.
In addition, the system might run slower and slower until it comes to a
stop; all processes requiring swap to continue running will wait for
it indefinitely.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
HP WDB 2.0 allows you to check for memory leaks in applications written for HP-UX 10.20 and 11.00 using C, ANSI C++, FORTRAN 77 and Fortran 90.
You can use two methods to identify heap-related problems:
set heap-check leaks [on | off]
command
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Enabling batch mode allows you to detect leaks by exercising your program
with a test suite. This mode generates a leak report, but no stack traces,
when your program run completes. Note that HP WDB 2.0 generates a leak
report only if your program terminates with an explicit call to exit()
.
You can use the batch mode only with non-threaded programs. Only leak checking is available in batch, all other analysis and diagnostics are disabled.
The leak report is sent to a file named /tmp/gdbrtc.log
. Each run
appends its output to the end of the file.
To use this feature, you must do the following:
/opt/langtools/lib/librtc.a
.
For 64-bit programs link with /opt/langtools/lib/pa20_64/librtc.a
.
The file librtc.a
must be listed before the C library in the link
line.
/usr/lib/libc.a
or the core libraries, /usr/lib/libcl.a
,
you must link with the corresponding shared version instead.
-lcl
linker
option.
/tmp/gdbrtc.log
, which contains a list of
memory leaks.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Several settings are available to control the amount of detail you can see when debugging memory leaks.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, HP WDB 2.0 reports each memory leak with at most four stack frames from the allocating call stack.
The depth of the call stack can be controlled by the command:
set heap-check frame-count numSpecifying a higher value helps you understand the allocation scenario better. However, the higher the value, the slower your program runs.
Larger stack depth values cause slower performance because HP WDB 2.0 must collect the stack trace for every allocation. The more levels of stack trace you want, the more time it takes to collect the stack trace.
HP WDB 2.0 takes more time because it cannot determine at the time a block is allocated if that block will eventually be leaked by the program.
For many programs, the default value should be appropriate.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
HP WDB 2.0 allows you to specify the minimum leak size for stack trace collection to improve the program's performance.
Stack trace collection slows down your program because it occurs on every allocation call. Therefore, if your program is allocation intensive, HP WDB 2.0 could spend a substantial amount of time collecting stack traces.
You could speed things up by using the command
set heap-check min-leak-size numFor example, if you use,
set heap-check min-leak-size 100HP WDB 2.0 does not collect stack traces for allocations less than 100 bytes. HP WDB still reports leaks smaller than this size, but does not include a stack trace.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The set heap-check leaks [on | off]
command controls
HP WDB 2.0 memory leak checking.
With leak checking turned on, you can generate a leak report any time the program is stopped inside the debugger, by using the command:
info leaks
When you use info leaks
, HP WDB 2.0 scans for memory leaks in
your program and produces a leak report, listing information such as the
leaks, size of blocks, number of instances. HP WDB 2.0 assigns each of
the leaks a unique number.
For additional leak information, use the command
info leak
leaknumber to display detailed information on
the leak including the allocation call stack.
Use these steps to report leaks:
/opt/langtools/lib/pa20_64/librtc.sl
.
Note: If you are using the static or dynamic linker version earlier than
B.11.17, you must link your 32-bit program with
/opt/langtools/lib/librtc.sl
.
/usr/lib/libc.a
, or the core libraries, /usr/lib/libcl.a
,
you must link with the corresponding shared version instead.
-leaks
or
use the command set heap-check leaks on
after starting the debugger.
info leaks
.
To see detailed information associated with a leak use the command
info leak
leaknumber
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This example describes checking a program running on HP-UX 11.00 using linker version B.11.17 or later.
/opt/langtools/lib/pa20_64/librtc.sl
.
/usr/lib/libc.sl
instead of
libc.a
.
> gdb a.out
(gdb) set heap-check leaks on
(gdb) b myfunction
(gdb) run
info
command to show list of memory leaks.
(gdb) info leaks Scanning for memory leaks...done 2439 bytes leaked in 25 blocks No. Total bytes Blocks Address Function 0 1234 1 0x40419710 foo() 1 333 1 0x40410bf8 main() 2 245 8 0x40410838 strdup() [...]The debugger assigns each leak a numeric identifier.
info leak
command and specify the number from the list associated with a leak.
(gdb) info leak 2 245 bytes leaked in 8 blocks (10.05% of all bytes leaked) These range in size from 26 to 36 bytes and are allocated in strdup () in link_the_list () at test.c:55 in main () at test.c:13 in _start ()
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
info heap
info heap
command.
The report does not show allocations that have already been freed.
For example, if you make several allocations, free them all, and then
you use info heap
, the result will not show any allocations.
info heap filename
info heap idnumber
set heap-check frame-count num
show heap-check
Here is an example that shows how to use this feature on HP-UX 11.00 with linker version B.11.17 or later installed.
/opt/langtools/lib/pa20_64/librtc.sl
for PA-64 programs.
Note: If your linker version is earlier than B.11.17, and you are debugging
a 32-bit program, you must link with /opt/langtools/lib/librtc.sl
.
set heap-check on
command.
(gdb) set heap-check on
(gdb) b myfunction
info heap
command.
(gdb) info heap Analyzing heap ...done 41558 bytes allocated in 28 blocks No. Total bytes Blocks Address Function 0 34567 1 0x40411000 foo() 1 4096 1 0x7bd63000 bar() 2 1234 1 0x40419710 baz() 3 245 8 0x404108b0 boo() [...]The display shows the currently allocated heap blocks. Any blocks that have been allocated and already freed, are not listed.
info heap
command.
(gdb) info heap 1 4096 bytes at 0x7bd63000 (9.86% of all bytes allocated) in bar () at test.c:108 in main () at test.c:17 in _start () in $START$ ()When there are multiple blocks allocated from the same call stack, HP WDB 2.0 displays additional information.
(gdb) info heap 3 245 bytes in 8 blocks (0.59% of all bytes allocated) These range in size from 26 to 36 bytes and are allocated in boo () in link_the_list () at test.c:55 in main () at test.c:13 in _start ()
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
+objdebug
option.
GDB uses the full path name to the object module files and searches the same directories for source files.
This behavior transparent, however, you can control over when and how object files are loaded with three commands.
objectdir path
Specify a colon (:) separated list of directories in which
GDB searches for object files. These directories are added to the
beginning of the existing objectdir
path. If you specify a directory
that is already in the objectdir
path, the specified directory
is moved up in the objectdir
path so that it is searched earlier.
GDB recognizes two special directory names: $cdir
, which
refers to the compilation directory (if available) and $cwd
, which
tracks GDB's current working directory.
objectload file.c
objectretry file.c
objectdir
path changes. By default, GDB does not try to
read an object file after an error.
Here are some items to check if the debugger can not find your source files.
-g
switch.
Type info sources to find the list of files that the debugger
knows were compiled with -g
.
On HP-UX, the debug information does not contain the
full path name to the source file, only the relative pathname
that was recorded at compile time. Consequently, you may need
several dir
commands for a complex application with multiple source
directories. One way to do this is to place them in a `.gdbinit'
file placed in the directory used to debug the application.
A sample of the `.gdbinit' file might look like the following:
dir /home/fred/appx/system dir /home/fred/appx/display dir /home/fred/appx/actor dir /home/fred/appx/actor/sys ...Note, When you compile your program with the
+objdebug
option,
the debugger may find your source files without using the dir
command.
This happens because the debugger stores the full path name to the object
files and searches for source files in the same directories.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
On HP-UX, shared libraries are special. Until the library is loaded, GDB does not know the names of symbols. However, GDB gives you two ways to set breakpoints in shared libraries.
catch load
command
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
On HP-UX, GDB automatically loads symbol definitions from shared libraries
when you use the run
command, or when you examine a core file.
(Before you issue the run
command, GDB does not understand
references to a function in a shared library--unless you are
debugging a core file).
When you specify a breakpoint using a name that GDB does not recognize, the debugger warns you with a message that it is setting a deferred breakpoint on the name you specified. If any shared library is loaded with a matching name then GDB sets the breakpoint.
For example, if you type:
`break foo'
the debugger does not know if foo
is a misspelled name or if
it is the name of a routine that has not yet been loaded from a
shared library. The debugger displays a warning message that it is
setting a deferred breakpoint on foo
. If any shared
library is loaded that contains a foo
, then GDB sets
the breakpoint.
If this is not what you want, for example the name was mis-typed, then you can delete the breakpoint.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
catch load
The command `catch load <libname>' causes the debugger to stop when the particular library is loaded. This gives you a chance to set breakpoints before routines are executed.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In cases where you attach to a running program and you try to set a breakpoint in a shared library, GDB may generated the following message:
The shared libraries were not privately mapped; setting a breakpoint in a shared library will not work until you rerun the program.GDB generates this message because the debugger sets breakpoints by replacing an instruction with a
BREAK
instruction.
The debugger can not
set a breakpoint in a shared library because doing so can affect other
processes on the system in addition to the process being debugged.
To set the breakpoint you must kill the program and then re-run it so that the dynamic linker will map a copy of the shared library. There are two ways to run the program:
dld
to map all shared libraries private, enabling breakpoint debugging.
`/opt/langtools/bin/pxdb -s on executable-name'
The pxdb -s on
command marks the executable so that dld
maps shared libraries private when the program starts up.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
My main program is in a shared library. I try to load it as follows:
(gdb) symbol-file main.sl Load new symbol table from "main.sl"? (y or n) y Reading symbols from main.sl done.Things don't appear to work.
This command is not the correct thing to do. This command assumes that `main.sl' is loaded at its link time address. This is not not true for shared libraries.
Do not use symbol-file
with shared libraries.
Instead, what you should do is to use the deferred breakpoint feature to set breakpoints on any functions necessary before the program starts running.
(gdb) b main Breakpoint 1 (deferred) at "main" ("main" was not found). Breakpoint deferred until a shared library containing "main" is loaded. (gdb) rOnce the program has started running, it will hit the breakpoint. In addition, the debugger will then already know about the sources for
main
, since it gets this information when the shared library is loaded.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can get some information about the arguments passed to the functions displayed in the stack trace in a non-debug, optimized executable.
GDB has no debug information, it does not know where the arguments are located or even the type of the arguments. There is no way for GDB to infer this in an optimized, non-debug executable.
However, for integer arguments you can find the first four parameters
for the top-of-stack frame by looking at the registers.
The first parameter will be in $r26
, the second in $r25
and so on.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
HP WDB 2.0 supports pthread
parallelism.
However, HP WDB 2.0 does not support compiler generated parallelism, e.g. with directives.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB works with ddd
the free GDB GUI shell available at
http://mumm.ibr.cs.tu-bs.de/.
While this is not formally supported by
Hewlett-Packard, these two do work together. Note however if you have
ddd
issues, you'll need to report them to the ddd
support
channel.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, GDB runs in line mode. For users who prefer an
interface similar (though not identical)
to that of the XDB debugger, HP provides a terminal user
interface (TUI), which appears when you invoke the gdb
command
with the -tui
option.
Use the -xdb
option to allow the use of a number of XDB
commands. See the XDB to WDB Transition Guide.
This guide contains the following topics:
Starting TUI How to start the Terminal User Interface Automatically Running Program Starting program automatically Screen Layouts The screen layouts Cycling through windows Cycling through windows Changing Window Focus Changing Window Focus Scrolling Windows Scrolling Windows Changing Reg Display Changing the Register Display Changing Window Size Changing Window Size TUI Refresh Refreshing and Updating the Screen
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Invoke the debugger using a command like the following:
gdb -xdb -tui a.out
These examples use the default terminal screen size of 24 by 80 characters. The terminal screen looks something like this.
The terminal is divided into two windows: a source window at the top and a command window at the bottom. In the middle is a locator bar that shows the current file, procedure, line, and program counter (PC) address, when they are known to the debugger. When you set a breakpoint on the main program by issuing the command b main an asterisk (*) appears opposite the first executable line of the program. When you execute the program up to the first breakpoint by issuing the command run a right angle bracket (Figure 1
|----------------------------------------------------------------------| |30 { | |31 /* Try two test cases. */ | |32 print_average (my_list, first, last); | |33 print_average (my_list, first, last - 3); | |34 } | |35 | |36 | |37 | |38 | |39 | |40 | |41 | |42 | |----------------------------------------------------------------------| File: average.c Procedure: ?? Line: ?? pc: ?? Wildebeest is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for Wildebeest. Type "show warranty" for details. ---Type <return> to continue, or q <return> to quit--- Wildebeest was built for PA-RISC 1.1 or 2.0 (narrow), HP-UX 11.00. .. (gdb)
>
) points to the current location. So after you
issue those commands, the screen looks something like this:
Figure 2
|----------------------------------------------------------------------| |27 } | |28 | |29 int main(void) | |30 { | |31 /* Try two test cases. */ | *>|32 print_average (my_list, first, last); | |33 print_average (my_list, first, last - 3); | |34 } | |35 | |36 | |37 | |38 | |39 | |----------------------------------------------------------------------| File: average.c Procedure: main Line: 32 pc: 0x3524 .. (gdb) b main Breakpoint 1 at 0x3524: file average.c, line 32. (gdb) run Starting program: /home/work/wdb/a.out Breakpoint 1, main () at average.c:32 (gdb)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
HP WDB 2.0 does not start running the target executable at startup as do `xdb' and HP DDE. This makes it easy to set break points before the target program's main function.
To make HP WDB 2.0 automatically start running the target program add these lines to your startup file, `.gdbinit':
break main start
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The TUI supports four windows within the terminal screen, in various combinations:
layout
command (abbreviated la
) allows you to change from one window configuration
to another.
Note: You can abbreviate any command to its shortest unambiguous form.
15.3.1 Source Window 15.3.2 Disassembly Window 15.3.3 Source/Disassembly Window 15.3.4 Disassembly/Register Window 15.3.5 Source/Register Window
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Source window, Figure 1, appears by default when you invoke the debugger. You can also make it appear by issuing the command
la src
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Disassembly window appears when you issue the command
la asmThe screen looks like this:
Figure 3
|----------------------------------------------------------------------| |;;; print_average (my_list, first, last); | *>|0x3524 <main+8> addil L'-0x800,%dp,%r1 | |0x3528 <main+12> ldo 0x730(%r1),%r26 | |0x352c <main+16> ldi 9,%r24 | |0x3530 <main+20> ldi 0,%r25 | |0x3534 <main+24> ldil L'0x3000,%r31 | |0x3538 <main+28> be,l 0x498(%sr4,%r31) | |0x353c <main+32> copy %r31,%rp | |;;; print_average (my_list, first, last - 3); | |0x3540 <main+36> addil L'-0x800,%dp,%r1 | |0x3544 <main+40> ldo 0x730(%r1),%r26 | |0x3548 <main+44> ldi 6,%r24 | |0x354c <main+48> ldi 0,%r25 | |----------------------------------------------------------------------| File: average.c Procedure: main Line: 32 pc: 0x3524 (gdb) b main Breakpoint 1 at 0x3524: file average.c, line 32. (gdb) r Starting program: /home/work/wdb/a.out Breakpoint 1, main () at average.c:32 (gdb) la asm (gdb)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Source/Disassembly window appears when you issue the command
la splitYou can also reach this window from the Source window with the XDB command
tdThe screen looks like this:
Figure 4
:......................................................................: *>:32 print_average (my_list, first, last); : :33 print_average (my_list, first, last - 3); : :34 } : :35 : :36 : :37 : :......................................................................: |;;; print_average (my_list, first, last); | *>|0x3524 <main+8> addil L'-0x800,%dp,%r1 | |0x3528 <main+12> ldo 0x730(%r1),%r26 | |0x352c <main+16> ldi 9,%r24 | |0x3530 <main+20> ldi 0,%r25 | |0x3534 <main+24> ldil L'0x3000,%r31 | |----------------------------------------------------------------------| File: average.c Procedure: main Line: 32 pc: 0x3524 Breakpoint 1 at 0x3524: file average.c, line 32. (gdb) r Starting program: /home/work/wdb/a.out Breakpoint 1, main () at average.c:32 (gdb) la asm (gdb) la split (gdb)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Disassembly/Register window appears when you issue the command
la regswhen the current window is the Source/Disassembly window. By default, the debugger displays the general registers.
The screen looks like this:
Figure 5
:.........................................................................: :flags 29000041 r1 51a800 rp 7f6ce597 : :r3 7f7f0000 r4 1 r5 7f7f06f4 : :r6 7f7f06fc r7 7f7f0800 r8 7f7f0800 : :r9 40006b10 r10 0 r11 40004b78 : :r12 1 r13 0 r14 0 : :r15 0 r16 40003fb8 r17 4 : :.........................................................................: |;;; print_average (my_list, first, last); | *>|0x3524 <main+8> addil L'-0x800,%dp,%r1 | |0x3528 <main+12> ldo 0x730(%r1),%r26 | |0x352c <main+16> ldi 9,%r24 | |0x3530 <main+20> ldi 0,%r25 | |0x3534 <main+24> ldil L'0x3000,%r31 | |----------------------------------------------------------------------| File: average.c Procedure: main Line: 32 pc: 0x3524 (gdb) r Starting program: /home/work/wdb/a.out Breakpoint 1, main () at average.c:32 (gdb) la asm (gdb) la split (gdb) la regs (gdb)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Source/Register window appears when you issue the command
la regswhen the current window is the Source window.
The screen looks like this:
Figure 6
:.........................................................................: :flags 29000041 r1 51a800 rp 7f6ce597 : :r3 7f7f0000 r4 1 r5 7f7f06f4 : :r6 7f7f06fc r7 7f7f0800 r8 7f7f0800 : :r9 40006b10 r10 0 r11 40004b78 : :r12 1 r13 0 r14 0 : :r15 0 r16 40003fb8 r17 4 : :.........................................................................: *>|32 print_average (my_list, first, last); | |33 print_average (my_list, first, last - 3); | |34 } | |35 | |36 | |37 | |----------------------------------------------------------------------| File: average.c Procedure: main Line: 32 pc: 0x3524 Breakpoint 1, main () at average.c:32 (gdb) la asm (gdb) la split (gdb) la regs (gdb) la src (gdb) la regs (gdb)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Use the commands
la nextand
la prevto move from one screen configuration to another without specifying a window name. If you specify
la next
repeatedly, the order the debugger uses is
src
)
asm
)
split
)
gdb
command with the -xdb
option as
well as the -tui
option, you can also use the following commands:
td
ts
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The command window always has keyboard focus, so that you can enter debugger commands. If there is only one other window (Source or Disassembly), the other window has the logical focus, so that you can scroll within that window by using the arrow keys or the Page Up and Page Down keys (on some keyboards these are Prev and Next).
Note: In the command window, the scrolling behavior only works for an `hpterm' and not for an `xterm' or `dtterm'.
If you are in split-screen mode, you may want to change the logical focus of the window. To do so, use the command
focus {win_name | prev | next}where win_name can be
src
, asm
, regs
, or cmd
.
Remember, if you change the focus to a window other than the command window,
you need to use focus cmd
to switch back to the command window to enter or scroll through commands.
For example, with the sequence of commands just issued, you are in split-screen mode with the focus in the Source window.
The window with logical focus has a border constructed from "|
" and
"-
".
A window that does not have logical focus has a border constructed from
":
"vand ".
":
By default, the Source window will scroll. To change the focus so that you can scroll in the Register window, use theFigure 7
:.........................................................................: :flags 29000041 r1 51a800 rp 7f6ce597 : :r3 7f7f0000 r4 1 r5 7f7f06f4 : :r6 7f7f06fc r7 7f7f0800 r8 7f7f0800 : :r9 40006b10 r10 0 r11 40004b78 : :r12 1 r13 0 r14 0 : :r15 0 r16 40003fb8 r17 4 : :.........................................................................: *>|32 print_average (my_list, first, last); | |33 print_average (my_list, first, last - 3); | |34 } | |35 | |36 | |37 | |----------------------------------------------------------------------| File: average.c Procedure: main Line: 32 pc: 0x3524 Breakpoint 1, main () at average.c:32 (gdb) la asm (gdb) la split (gdb) la regs (gdb) la src (gdb) la regs (gdb)
focus
command
(abbreviated foc
or fs
):
fs regsor
foc nextIf you then use the Page Down key to scroll in the Register window, the screen looks like this:
Figure 8
|-------------------------------------------------------------------------| |flags 29000041 r1 51a800 rp 7f6ce597 | |r3 7f7f0000 r4 1 r5 7f7f06f4 | |r6 7f7f06fc r7 7f7f0800 r8 7f7f0800 | |r9 40006b10 r10 0 r11 40004b78 | |r12 1 r13 0 r14 0 | |r15 0 r16 40003fb8 r17 4 | |-------------------------------------------------------------------------| *>:32 print_average (my_list, first, last); : :33 print_average (my_list, first, last - 3); : :34 } : :35 : :36 : :37 : :......................................................................: File: average.c Procedure: main Line: 32 pc: 0x3524 (gdb) la asm (gdb) la split (gdb) la regs (gdb) la src (gdb) la regs (gdb) foc next Focus set to REGS window. (gdb)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To scroll a window, you can use the arrow keys or the Page Up and Page Down keys (on some keyboards these are Prev and Next). You can also use the following commands:
{+ | -} [num_lines] [win_name]
+
) or backward (-
).
+
or -
with no arguments scrolls the window forward or
backward one page. Use num_lines to specify how many
lines to scroll the window. Use win_name to specify a window
other than the one with logical focus.
{< | >}[num_char] [win_name]
<
) or right (>
)
the specified number of characters. If you do not specify
num_char, the window is scrolled one character.
Note that a space is required between the +
, -
, <
, or
>
and the number.
To scroll the command window, use the scroll bars on the terminal window.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To look at the floating-point or special registers instead of the general registers, and then to return to the general registers, you can use the following XDB commands:
fr
display $fregs
sr
display $sregs
gr
display $gregs
For example, if you use the fr
command, the screen looks like this:
The default floating-point register display is single-precision. To change the register display to double-precision and then back again, use the XDB toggle float command:Figure 9
|-------------------------------------------------------------------------| |flags 29000041 r1 51a800 rp 7f6ce597 | |r3 7f7f0000 r4 1 r5 7f7f06f4 | |r6 7f7f06fc r7 7f7f0800 r8 7f7f0800 | |r9 40006b10 r10 0 r11 40004b78 | |r12 1 r13 0 r14 0 | |r15 0 r16 40003fb8 r17 4 | :......................................................................: :30 { : :31 /* Try two test cases. */ : *>:32 print_average (my_list, first, last); : :33 print_average (my_list, first, last - 3); : :34 } : :35 : :......................................................................: File: average.c Procedure: main Line: 32 pc: 0x3524 (gdb) la regs (gdb) la src (gdb) la regs (gdb) foc next Focus set to REGS window. (gdb) fr #0 main () at average.c:32 (gdb)
toggle $fregsThe screen looks like this:
Figure 10
|-------------------------------------------------------------------------| |fpsr 0 fpe1 0 | |fpe2 0 fpe3 0 | |fpe4 0 fpe5 0 | |fpe6 0 fpe7 0 | |fr4 0 fr4R 0 | |fr5 1.0000000000000011 fr5R 7.00649232e-45 | |-------------------------------------------------------------------------| *>:32 print_average (my_list, first, last); : :33 print_average (my_list, first, last - 3); : :34 } : :35 : :36 : :37 : :......................................................................: File: average.c Procedure: main Line: 32 pc: 0x3524 (gdb) la regs (gdb) la src (gdb) la regs (gdb) foc next Focus set to REGS window. (gdb) fr (gdb) tf (gdb)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To specify a new height for a window or to increase or decrease the current
height, use the winheight
command (abbreviated winh
or wh
).
The syntax is:
winheight [win_name] [+ | -] num_linesIf you omit win_name, the window with logical focus is resized. When you increase the height of a window, the height of the command window is decreased by the same amount, and vice versa. The height of any other windows remains unchanged.
For example, the command
wh src +3increases the size of the source window, and decreases the size of the command window, by 3 lines.
To find out the current sizes of all windows, use the info win
command. For example, if you have a split-screen layout, the command
output might be as follows:
(gdb) i win SRC (8 lines) REGS (8 lines) CMD (8 lines)If you use the mouse or window menus to resize the terminal window during a debugging session, the screen remains the same size it was when you started. To change the screen size, you must exit the debugger and restart it.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If the screen display is disrupted for some reason, use the
refresh
command (ref
) to restore the windows to their
previous state:
refIf you use stack-navigation commands such as
up
, down
,
and frame
to change your source location, and you wish to return the
display to the current point of execution, use the update
command (upd
):
upd
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This is a transition aid designed for XDB users who are learning HP WDB 2.0, an HP-supported version of the industry-standard GDB debugger. Select one of these lists for a table that shows HP WDB 2.0 equivalents for many common XDB commands and other features.
Invoke HP WDB 2.0 with the command gdb -tui
to obtain a
terminal user interface (TUI) similar to that provided by XDB.
Commands marked "(with -tui
)" are valid when you use the -tui
option.
Invoke HP WDB 2.0 with the command gdb -xdb
to turn on XDB
compatibility mode, which allows you to use many XDB commands as synonyms
for GDB commands. Commands marked "(with -xdb
)" are valid
when you use the -xdb
option.
You may use both -xdb
and -tui
at the same time.
Some commands are valid only when you use both options.
For a tutorial introduction to HP WDB 2.0, see Getting Started with HP WDB 2.0
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, HP WDB runs in line mode. To run it with a terminal user interface similar to that of XDB, use the
-tui
option.
XDB Command | HP WDB 2.0 Equivalent | Meaning |
xdb program |
gdb -xdb program,
gdb -xdb -tui program
| Debug program |
xdb program corefile |
gdb -xdb program -c corefile
| Debug core file |
xdb -d dir |
gdb -xdb -d dir
| Specify alternate directory to search for source files |
xdb -P pid program |
gdb -xdb program pid
| Attach to running program at invocation |
xdb -i |
(after starting)
run < file
| Specify input to target program |
xdb -o |
(after starting)
run > file
| Specify output from target program |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These commands are all TUI mode commands and/or XDB compatibility
mode commands. They are available when you invoke HP WDB 2.0 by using
the -tui
or -xdb
or both options.
XDB Command | HP WDB 2.0 Equivalent | Meaning |
{+ | -}r |
{+ | -}r (with -xdb -tui ), {+ | -} data (with -tui )
| Scroll floating-point registers forward or backward (src , cmd , and asm are
also valid window names)
|
fr |
fr (with -xdb -tui ), display $fregs (with -tui )
| Display floating-point registers |
gr |
gr (with -xdb -tui ), display $regs (with -tui )
| Display general registers |
sr |
sr (with -xdb -tui ), display $sregs (with -tui )
| Display special registers |
td |
td (with -xdb -tui )
| Toggle disassembly mode |
tf |
tf (with -xdb -tui ), toggle $fregs (with -tui )
| Toggle float register display precision |
ts |
ts (with -xdb -tui )
| Toggle split-screen mode |
u |
u (with -xdb -tui ), update (with -tui )
| Update screen to current execution point |
U |
U (with -xdb -tui ), refresh (with -tui )
| Refresh all windows |
w number |
w number (with -xdb -tui ), winheight src number
(with -tui )
| Set size of source window |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | HP WDB 2.0 Equivalent | Meaning |
{+ | -}[number] | {+ | -}[ number] (with -tui ; note that a space is required between + or - and the number)
| Move view location forward or backward in source file number lines |
/ [string] |
/ [string] (with -xdb ), search regexp,
forw regexp
| Search source forward for [last] string |
? [string] |
? [string] (with -xdb ), rev regexp
| Search source backward for [last] string |
D " dir" |
D " dir" (with -xdb ), dir pathname
| Add a directory search path for source files |
L |
L (with -xdb )
| Show current viewing location or current point of execution |
ld |
ld (with -xdb ), show directories
| List source directory search path (list all directories) |
lf |
lf (with -xdb ), info sources
| List all source files |
lf [string] |
No equivalent | List matching files |
n |
fo or rev
| Repeat previous search |
N |
fo or rev
| Repeat previous search in opposite direction |
v |
v (with -xdb ), list
| Show one source window forward from current |
v location |
v location (with -xdb ), list location
| View source at location in source window |
va address |
va address (with -xdb ), disas address
| View address in disassembly window |
va label |
va label (with -xdb ), disas label
| View label in disassembly window (label is a location) |
va label + offset |
va label + offset (with -xdb ), disas label
+ offset
| View label + offset in disassembly window |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Use the D
or dir
command to add new directories to be searched
for source files. See See XDB-fil.
GDB does not provide a source directory mapping capability
and therefore does not have any equivalent of the
apm
, dpm
, and lpm
commands.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are many info
commands in addition to those shown here.
Use help info
to get a list.
XDB Command | HP WDB 2.0 Equivalent | Meaning |
l |
l (with -xdb ), info args followed by info locals
| List all parameters and locals of current procedure |
lc [string] |
lc [string] (with -xdb ), info common string
| List all (or matching) commons |
lg [string] |
lg [string] (with -xdb ), info variables [string]
| List all (or matching) globals |
ll [string] |
info functions [string], info variables [string],
maint print msymbols file
| List the contents of the linker symbol table |
lm |
show user
| List all string macros |
lm string |
show user string
| List matching string macros |
lo [[class]:: ][string] |
info func [[class]:: ][string]
| List all (or matching) overloaded functions |
lp |
info functions
| Show current scope, list program blocks, list names (symbols) |
lp [[class]:: ]string |
info func [[class]:: ]string
info addr [[class]:: ]string
| List all (or matching) procedures |
lr |
lr (with -xdb ), info all-reg
| List all registers |
lr string |
lr string (with -xdb ), info reg string
| List matching registers |
ls [string] |
No equivalent | List all (or matching) special variables |
mm |
info sharedlibrary
| Show memory map of all loaded shared libraries |
mm string |
No equivalent | Show memory map of matching loaded shared libraries |
p expr[\ format |
p [/ format expr
[Note: The count and size portions of formats are not allowed in the p (print )
command. They are allowed in the x command (examine memory).]
| Print value using the specified format |
p expr? format |
p/ format & expr
| Print address using specified format |
p class:: |
No equivalent | Print static members of class |
p $lang |
show language
| Inquire what language is used |
p {+ | -}[\ format |
Use x/ format command to obtain initial value, then use x with no argument
to obtain value of next memory location. To obtain value of previous memory location, use "x $_ - 1 ".
| Print value of next/previous memory location using format |
pq expr |
set expr, set var expr
| Evaluate using the specified format |
pq expr? format |
No equivalent | Determine address using specified format |
pq class:: |
No equivalent | Evaluate static members of class |
pq {+ | -}[\ format |
No equivalent | Evaluate next/previous memory location using format |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The GDB concept of the top and bottom of the stack is the
opposite of XDB
's, so XDB
's up
is GDB's
down
.
XDB Command | HP WDB 2.0 Equivalent | Meaning |
down |
up
| View procedure one level nearer outermost frame of stack (higher number) |
down number |
up number
| View procedure number levels nearer outermost frame of stack |
t [depth] |
t [depth] (with -xdb ), bt [depth]
| Print stack trace to depth |
T [depth] |
T [depth] (with -xdb ), bt full [depth]
| Print stack trace and show local vars |
top |
frame 0
| View procedure at innermost frame of stack |
up |
down
| View procedure one level nearer innermost frame of stack (lower number) |
up number |
down number
| View procedure number levels nearer innermost frame of stack |
V [depth] |
V [depth] (with -xdb ), frame [depth]
| Display text for current active procedure or at specified depth on stack |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Type show
with no arguments to get a list of current
debugger settings.
XDB Command | HP WDB 2.0 Equivalent | Meaning |
I |
info (many kinds), show (many kinds)
| Display state of debugger and program |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | HP WDB 2.0 Equivalent | Meaning |
c |
c , continue
| Continue from breakpoint, ignoring any pending signal |
c location |
until location
| Continue from breakpoint, ignoring any pending signal, set temporary breakpoint at location |
C |
c , continue
| Continue, allowing any pending signal |
C [location] |
until location
| Continue, allowing any pending signal, set temporary breakpoint at location |
g line |
g line (with -xdb ), go line,
tb line followed by jump line
| Go to line in current procedure |
g # label |
No equivalent | Go to label in current procedure |
g {+ | -}lines |
g {+ | -}lines (with -xdb ), go {+ | -}lines,
tb {+ | -}lines followed by jump {+ | -}lines
| Go forward or back given # lines |
g {+ | -} |
g {+ | -} (with -xdb ), go {+ | -}1 ,
tb {+ | -}1 followed by jump {+ | -}1
| Go forward or back 1 line |
k |
k
| Detach and terminate target |
r [arguments] |
r [arguments]
| Run with last arguments [or with new arguments] |
R |
R (with -xdb ), r
| Rerun with no arguments |
s |
s , si
| Single step (into procedures) (si : step by instruction)
|
s number |
s number, si number
| Single step number steps (into procedures) (si : step by instruction)
|
S |
S (with -xdb ), n , ni
| Step over (ni : step over by instruction)
|
S number |
S number (with -xdb ), n number,
ni number
| Step over by number statements or instructions (ni :
step over by instruction)
|
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | HP WDB 2.0 Equivalent | Meaning |
lb |
lb (with -xdb ), i b
| List breakpoints |
tb |
No equivalent | Toggle overall breakpoint state |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | HP WDB 2.0 Equivalent | Meaning |
" any_string" |
p " any_string"
| Print any_string |
if expr {cmds} [{cmds}] |
if expr
cmds
[else
cmds]
end
| Conditionally execute cmds |
Q |
Q (with -xdb ), silent (must be first command in a
commands list)
| Quiet breakpoints |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The GDB equivalent of the count
and cmds
arguments
is to use the commands
bnum command to set an ignore count
and/or to specify commands to be executed for that breakpoint.
For C++ programs, you can use the regular-expression breakpoint
command rbreak
to set breakpoints on all the member functions of a
class or on overloaded functions outside a class.
XDB Command | HP WDB 2.0 Equivalent | Meaning |
b loc |
b loc
| Set a breakpoint at the specified location |
b |
b
| Set a breakpoint at the current line |
ba address |
ba address (with -xdb ), b * address
| Set breakpoint at a code address |
bb [depth] |
No equivalent (use b proc)
| Set breakpoint at procedure beginning |
bi expr. proc |
b class:: proc
cond bnum (this == expr)
| Set an instance breakpoint at the first executable line
of expr. proc
|
bi -c expr |
No equivalent | Set an instance breakpoint at first executable line of all non-static member functions of the instance's class (no base classes) |
bi -C expr |
No equivalent | Set an instance breakpoint at first executable line of all non-static member functions of the instance's class (base classes included) |
bpc -c class |
rb ^ class::*
| Set a class breakpoint at first executable line of all member functions of the instance's class (no base classes) |
bpc -C class |
Use rb ^ class::* for base classes also
| Set a class breakpoint at first executable line of all member functions of the class (base classes included) |
bpo proc |
rb proc
| Set breakpoints on overloaded functions outside a class |
bpo class:: proc |
b class:: proc
| Set breakpoints on overloaded functions in a class |
bt [depth] |
No equivalent | Set trace breakpoint at procedure at specified depth on program stack |
bt proc |
b proc
commands bnum
finish
c
end
| Set trace breakpoint at proc |
bu [depth] |
bu [depth] (with -xdb ). The finish command
is equivalent to the sequence bu , c , db (to continue
out of the current routine).
| Set up-level breakpoint |
bx [depth] |
bx [depth] (with -xdb )
| Set a breakpoint at procedure exit |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | HP WDB 2.0 Equivalent | Meaning |
ab number |
enable number
| Activate suspended breakpoint of the given number |
ab * |
enable
| Activate all suspended breakpoints |
ab @ shared-library |
No equivalent | Activate suspended breakpoints in named shared library |
bc number expr |
bc number expr (with -xdb ),
ignore number expr (within a commands list)
| Set a breakpoint count |
db |
clear
| Delete breakpoint at current line |
db number |
delete number
| Delete breakpoint of the given number |
db * |
delete
| Delete all breakpoints |
sb number |
disable number
| Suspend breakpoint of the given number |
sb * |
disable
| Suspend all breakpoints |
sb @ shared-library |
No equivalent | Suspend breakpoints in named shared library |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB does not provide the ability to set breakpoints on all procedures with a single command. Therefore, it does not have any equivalent of the following commands:
bpt bpx dp Dpt Dpx
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | HP WDB 2.0 Equivalent | Meaning |
abc cmds |
No exact equivalent, but display expr is equivalent to abc print expr
| Set or delete cmds to execute at every stop |
dbc |
undisplay
| Stop displaying values at each stop |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB does not provide the ability to trace by instruction.
Watchpoints, however, provide similar functionality to xdb
assertions.
For example, watchpoints can be:
aa
)
da
)
info watch
)
x
)
a aa da la sa ta x
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Use the source
command to read commands from a file.
GDB does not provide a recording capability like XDB's, but you
can use the set history save
command to record all GDB commands in
the file ./.gdb_history
(similar to the $HOME/.xdbhist file). The
history file is not saved until the end of your debugging session.
To change the name of the history file, use set history filename
.
To stop recording, use set history save off
.
To display the current history status, use show history
.
For an equivalent of the XDB record-all facility, pipe the output of
the gdb
command to the tee(1) command. For example:
gdb a.out | tee mylogfileThis solution works with the default line-mode user interface, not with the terminal user interface.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Use the show user
or help user-defined
command to obtain a
list of all user-defined commands.
XDB Command | HP WDB 2.0 Equivalent | Meaning |
def name replacement-text |
def name
[GDB prompts for commands]
| Define a user-defined command |
tm |
No equivalent | Toggle the macro substitution mechanism |
undef name |
def name
[follow with empty command list]
| Remove the macro definition for name |
undef * |
No equivalent | Remove all macro definitions |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | HP WDB 2.0 Equivalent | Meaning |
lz |
lz (with -xdb ), info signals
| List signal handling |
z number s |
z number s (with -xdb ),
handle numberstop , handle number nostop
| Toggle stop flag for signal number |
z number i |
z number i (with -xdb ),
handle numbernopass , handle number pass
| Toggle ignore flag for signal number |
z number r |
z number r (with -xdb ), handle number
print , handle number noprint
| Toggle report flag for signal number |
z number Q |
z number Q (with -xdb ), handle number
noprint
| Do not print the new state of the signal |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | HP WDB 2.0 Equivalent | Meaning |
Return | Return | Repeat previous command |
~ |
Return | Repeat previous command |
; |
No equivalent (one command per line in command list) | Separate commands in command list |
! cmd_line |
! cmd_line (with -xdb ), she cmd_line
| Invoke a shell |
{cmd_list} | commands [number]
...
end
| Execute command list (group commands) |
Control-C | Control-C | Interrupt the program |
# [text] |
# [text]
| A comment |
am |
am (with -xdb ), set height num
| Activate more (turn on pagination) |
f [" printf-style-fmt" ] |
No equivalent | Set address printing format |
h |
h
| Help |
M [{t | c } [expr[; expr...]]] |
No equivalent | Print object or corefile map |
q |
q
| Quit debugger |
sm |
sm (with -xdb ), set height 0
| Suspend more (turn off pagination) |
ss file |
No equivalent | Save (breakpoint, macro, assertion) state |
tc |
No equivalent | Toggle case sensitivity in searches |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The format of the print
command is different in XDB and GDB:
XDB: p expr\fmt GDB: p/fmt exprUse the GDB command
set print pretty
to obtain a structure display
formatted similarly to the default XDB display.
XDB Command | HP WDB 2.0 Equivalent | Meaning |
b |
d
| Byte in decimal |
B (1) |
d
| Byte in decimal |
c |
c
| Character |
C (1) |
c
| Wide character |
d |
d
| Decimal integer |
D (1) |
d
| Long decimal integer |
e |
No equivalent | e floating-point notation as float
|
E (1) |
No equivalent | e floating-point notation as double
|
f |
No equivalent | f floating-point notation as float
|
F (1) |
No equivalent | f floating-point notation as double
|
g |
f
| g floating-point notation as float
|
G (1) |
f
| g floating-point notation as double
|
i |
Use x/i command
| Machine instruction (disassembly) |
k |
No equivalent | Formatted structure display |
K (1) |
No equivalent | Formatted structure display with base classes |
n |
print
| Normal (default) format, based on type |
o |
o
| Expression in octal as integer |
O (1) |
o
| Expression in octal as long integer |
p |
a
| Print name of procedure containing address |
s |
No equivalent | String |
S |
No equivalent | Formatted structure display |
t |
whatis , ptype
| Show type of the expression |
T (1) |
ptype
| Show type of expression, including base class information |
u |
u
| Expression in unsigned decimal format |
U (1) |
u
| Expression in long unsigned decimal format |
w |
No equivalent | Wide character string |
W (1) |
No equivalent | Address of wide character string |
x |
x
| Print in hexadecimal |
X (1) |
x
| Print in long hexadecimal |
z |
t
| Print in binary |
Z (1) |
t
| Print in long binary |
(1) HP WDB will display data in the size appropriate for the data.
It will not extend the length displayed in response to one of the uppercase
formchars (e.g. O
, D
, F
).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Location Syntax | HP WDB 2.0 Equivalent | Meaning |
line | line | Source line and code address |
file[: line] |
file[: line]
| Source line and code address |
proc | proc | Procedure name |
[file: ]proc[: proc[...]][: line] |
No equivalent | Source line and code address |
[file: ]proc[: proc[...]][:# label] |
No equivalent | Source line and code address |
[class]:: proc |
[class]:: proc
| Source line and code address |
[class]:: proc[: line] |
No equivalent | Source line and code address |
[class]:: proc[# label] |
No equivalent | Source line and code address |
proc# line |
No equivalent | Code address |
[class]:: proc# line |
No equivalent | Code address |
# label |
No equivalent | Source line and code address |
name@ shared-library |
No equivalent | Address of name in shared library shared-library |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Language Operator | HP WDB 2.0 Equivalent | Meaning |
$addr |
Depends on language | Unary operator, address of object |
$in |
No equivalent | Unary Boolean operator, execution in procedure |
$sizeof |
sizeof
| Unary operator, size of object |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB does not provide special variables of the kind that XDB has, but
you can use show
and set
to display and modify many
debugger settings.
XDB Special Variable | HP WDB 2.0 Equivalent | Meaning |
$cplusplus |
No equivalent | C++ feature control flags |
$depth |
No equivalent | Default stack depth for local variables |
$fpa |
No equivalent | Treat FPA sequence as one instruction |
$fpa_reg |
No equivalent | Address register for FPA sequences |
$lang |
show language
| Current language for expression evaluation |
$line |
No equivalent | Current source line number |
$malloc |
No equivalent | Debugger memory allocation (bytes) |
$print |
No equivalent | Display mode for character data |
$ regname |
$ regname
| Hardware registers |
$result |
Use $ n (value history number assigned to the desired result)
| Return value of last command line procedure call |
$signal |
No equivalent | Current child procedure signal number |
$step |
No equivalent | Number of instructions debugger will step in non-debuggable procedures before free-running |
$ var |
$ var
| Define or use special variable (convenience variable) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Variable Identifier | HP WDB 2.0 Equivalent | Meaning |
var | var | Search for var |
class:: var |
class:: var
| Search class for var (bug: not yet) |
[[class]:: ]proc: [class:: ]var |
proc:: var
| Search proc for var (static variables only) |
[[class]:: ]proc: depth: [class:: ] |
No equivalent | Search proc for depth on stack |
. (dot) |
Empty string; for example, p is the equivalent of p .
| Shorthand for last thing you looked at |
: var or :: var |
:: var to distinguish a global from a local variable with same name
| Search for global variable only |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
16.8.1 A 16.8.2 B 16.8.3 C through D 16.8.4 F through K 16.8.5 L 16.8.6 M through P 16.8.7 Q through S 16.8.8 T 16.8.9 U through Z 16.8.10 Symbols
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | Equivalent HP WDB 2.0 Command |
a [cmds] |
No equivalent |
aa number |
No equivalent |
aa * |
No equivalent |
ab number |
enable number
|
ab * |
enable
|
ab @ shared-library |
No equivalent |
abc cmds |
No exact equivalent, but display expr is equivalent to abc print expr
|
am |
am (with -xdb ), set height num
|
apm oldpath [newpath] |
No equivalent |
apm "" [newpath] |
No equivalent |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | Equivalent HP WDB 2.0 Command |
b loc |
b loc
|
b |
b
|
ba address |
ba address (with -xdb ), b * address
|
bb [depth] |
No equivalent (use b proc)
|
bc number expr |
bc number expr (with -xdb ), ignore number expr
(within a commands list)
|
bi expr. proc |
b class:: proc
cond bnum (this == expr)
|
bi -c expr |
No equivalent |
bi -C expr |
No equivalent |
bp |
No equivalent |
bp cmds |
No equivalent |
bpc -c class |
rb ^ class:: *
|
bpc -C class |
Use rb ^ class::* for base classes also
|
bpo proc |
rb proc
|
bpo class:: proc |
b class:: proc
|
bpt |
No equivalent |
bpt cmds |
No equivalent |
bpx |
No equivalent |
bpx cmds |
No equivalent |
bt [depth] |
No equivalent |
bt proc |
b proc
commands bnum
finish c end |
bu [depth] |
bu [depth] (with -xdb ). The finish command is equivalent to the
sequence bu , c , db (to continue out of the current routine).
|
bx [depth] |
bx [depth] (with -xdb )
|
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | Equivalent HP WDB 2.0 Command |
c |
c , continue
|
c location |
until location
|
C |
c , continue
|
C location |
until location
|
D " dir" |
D " dir" (with -xdb ), dir pathname
|
da number |
No equivalent |
da * |
No equivalent |
db |
clear
|
db number |
delete number
|
db * |
delete
|
dbc |
undisplay
|
def name replacement-text |
def name
[GDB prompts for commands]
|
down |
up
|
down number |
up number
|
dp |
No equivalent |
dpm index |
No equivalent |
dpm * |
No equivalent |
Dpt |
No equivalent |
Dpx |
No equivalent |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | Equivalent HP WDB 2.0 Command |
f [" printf-style-fmt" ] |
No equivalent |
fr |
fr (with -xdb -tui ), display $fregs (with -tui )
|
g line |
g line (with -xdb ), go line,
tb line followed by jump line
|
g # label |
No equivalent |
g {+ | -}lines |
g {+ | -}lines (with -xdb ), go {+ | -}lines
tb {+ | -}lines followed by jump {+ | -}lines
|
g {+ | -} |
g {+ | -} (with -xdb ), go {+ | -}1 ,
tb {+ | -}1 followed by jump {+ | -}1
|
gr |
gr (with -xdb -tui ), display $regs (with -tui )
|
h |
h
|
if expr {cmds} [{cmds}] |
if expr
cmds
[else
cmds]
end
|
I |
info (many kinds), show (many kinds)
|
k |
k
|
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | Equivalent HP WDB 2.0 Command |
l |
l (with -xdb ), info args followed by info locals
|
L |
L (with -xdb )
|
la |
No equivalent |
lb |
lb (with -xdb ), i b
|
lc [string] |
lc [string] (with -xdb ), info common string
|
ld |
ld (with -xdb ), show directories
|
lf |
lf (with -xdb ), info sources
|
lf [string] |
No equivalent |
lg [string] |
lg [string] (with -xdb ), info variables [string]
|
ll [string] |
info functions [string], info variables [string],
maint print msymbols file
|
lm [string] |
show user [string]
|
lo [[class]:: ][string] |
info func [[class]:: ][string]
|
lp |
info functions
|
lp [[class]:: ]string |
info func [[class]:: ]string
info addr [[class]:: ]string
|
lpm |
No equivalent |
lr |
lr (with -xdb ), info all-reg
|
lr string |
lr string (with -xdb ), info reg string
|
ls [string] |
No equivalent |
lz |
lz (with -xdb ), info signals
|
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | Equivalent HP WDB 2.0 Command |
M [{t | c } [expr[; expr...]]] |
No equivalent |
mm |
info sharedlibrary
|
mm string |
No equivalent |
N |
fo or rev
|
n |
fo or rev
|
p expr[\ format] |
p [/ format] expr
[Note: The count and size portions of formats are not allowed in the p (print )
command. They are allowed in the x command (examine memory).]
|
p expr? format |
p/ format & expr
|
p class:: |
No equivalent |
p $lang |
show language
|
p {+ | -}[\ format |
Use x/ format command to obtain initial value, then use x with no argument
to obtain value of next memory location. To obtain value of previous memory location, use "x $_ - 1 ".
|
pq expr |
set expr, set var expr
|
pq expr? format |
No equivalent |
pq class:: |
No equivalent |
pq [+ | -][\ format |
No equivalent |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | Equivalent HP WDB 2.0 Command |
q |
q
|
Q |
Q (with -xdb ), silent (must be first command in a commands list)
|
r [arguments] |
r [arguments]
|
R |
R (with -xdb ), r
|
s |
s , si
|
s number |
s number, si number
|
S |
S (with -xdb ), n , ni
|
S number |
S number (with -xdb ), n number, ni number
|
sa number |
No equivalent |
sa * |
No equivalent |
sb number |
disable number
|
sb * |
disable
|
sb @ shared-library |
No equivalent |
sm |
sm (with -xdb ), set height 0
|
sr |
sr (with -xdb -tui ), display $sregs (with -tui )
|
ss file |
No equivalent |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | Equivalent HP WDB 2.0 Command |
t [depth] |
t [depth] (with -xdb ), bt [depth]
|
T [depth] |
T [depth] (with -xdb ), bt full [depth]
|
ta |
No equivalent |
tb |
No equivalent |
tc |
No equivalent |
td |
td (with -xdb -tui )
|
tf |
tf (with -xdb -tui ), toggle $fregs (with -tui )
|
tm |
No equivalent |
top |
frame 0
|
tr [@ ] |
No equivalent |
ts |
ts (with -xdb -tui )
|
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Command | Equivalent HP WDB 2.0 Command |
u |
u (with -xdb -tui ), update (with -tui )
|
U |
U (with -xdb -tui ), refresh (with -tui )
|
undef name |
def name
[follow with empty command list]
|
undef * |
No equivalent |
up |
down
|
up number |
down number
|
v |
v (with -xdb ), list
|
v location |
v location (with -xdb ), list location
|
V [depth] |
V [depth] (with -xdb ), frame [depth]
|
va address |
va address (with -xdb ), disas address
|
va label |
va label (with -xdb ), disas label
|
va label + offset |
va label + offset (with -xdb ), disas label
+ offset
|
w number |
w number (with -xdb -tui ), winheight src number
(with -tui )
|
x [expr] |
No equivalent |
xdb program |
gdb -xdb program, gdb -xdb -tui program
|
xdb program corefile |
gdb -xdb program -c corefile
|
xdb -d dir |
gdb -xdb -d dir
|
xdb -P pid program |
gdb -xdb program pid
|
xdb -i |
(after starting)
run < file
|
xdb -o |
(after starting)
run > file
|
z number s |
z number s (with -xdb ), handle number
stop , handle number nostop
|
z number i |
z number i (with -xdb ), handle number
nopass , handle number pass
|
z number r |
z number r (with -xdb ), handle number
print , handle number noprint
|
z number Q |
z number Q (with -xdb ), handle number
noprint
|
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XDB Symbol | Equivalent HP WDB Symbol |
line | line |
file[: line] |
file[: line]
|
proc | proc |
[file: ]proc[: proc[...]][: line] |
No equivalent |
[file: ]proc[: proc[...]][:# label] |
No equivalent |
[class]:: proc |
[class]:: proc
|
[class]:: proc[: line] |
No equivalent |
[class]:: proc[# label] |
No equivalent |
proc# line |
No equivalent |
[class]:: proc# line |
No equivalent |
name@ shared-library |
No equivalent |
var | var |
class:: var |
class:: var (bug: not yet)
|
[[class]:: ]proc: [class:: ]var |
proc:: var (static variables only)
|
[[class]:: ]proc: depth: [class:: ]var |
No equivalent |
Return | Return |
" any_string" |
p " any_string"
|
. (dot) |
Empty string; for example, p is the equivalent of p .
|
~ |
Return |
{+ | -}r |
{+ | -}r (with -xdb -tui ), {+ | -} data (with -tui )
|
{+ | -}[number] | {+ | -}[ number] (with -tui ; note that a space is required between + or - and the number)
|
/ [string] |
/ [string] (with -xdb ), search regexp,
forw regexp
|
? [string] |
? [string] (with -xdb ), rev regexp
|
; |
No equivalent (one command per line in command list) |
: var or :: var |
:: var
|
! cmd_line |
! cmd_line (with -xdb ), she cmd_line
|
{cmd_list} | commands [number]
...
end
|
< file |
source file
|
<< file |
No equivalent |
> |
No equivalent |
> file |
No equivalent |
>c |
No equivalent |
>f |
No equivalent |
>t |
No equivalent |
No equivalent | |
>@ file |
No equivalent |
>> |
No equivalent |
>> file |
No equivalent |
>>@ |
No equivalent |
>>@ file |
No equivalent |
Control-C | Control-C |
# [text] |
# [text]
|
# label |
No equivalent |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can alter the way GDB interacts with you by using the
set
command. For commands controlling how GDB displays
data, see Print Settings. Other settings are
described here.
Prompt Prompt Editing Command editing History Command history Screen Size Screen size Numbers Numbers Messages/Warnings Optional warnings and messages
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB indicates its readiness to read a command by printing a string
called the prompt. This string is normally `(gdb)'. You
can change the prompt string with the set prompt
command. For
instance, when debugging GDB with GDB, it is useful to change
the prompt in one of the GDB sessions so that you can always tell
which one you are talking to.
Note: set prompt
does not add a space for you after the
prompt you set. This allows you to set a prompt which ends in a space
or a prompt that does not.
set prompt newprompt
show prompt
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB reads its input commands via the readline interface. This
GNU library provides consistent behavior for programs which provide a
command line interface to the user. Advantages are GNU Emacs-style
or vi-style inline editing of commands, csh
-like history
substitution, and a storage and recall of command history across
debugging sessions.
You may control the behavior of command line editing in GDB with the
command set
.
set editing
set editing on
set editing off
show editing
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GDB can keep track of the commands you type during your debugging sessions, so that you can be certain of precisely what happened. Use these commands to manage the GDB command history facility.
To make command history understand your vi key bindings you need to create a `~/.inputrc' file with the following contents:
set editing-mode viThe readline interface uses the `.inputrc' file to control the settings.
set history filename fname
GDBHISTFILE
, or to
`./.gdb_history' (`./_gdb_history' on MS-DOS) if this variable
is not set.
set history save
set history save on
set history filename
command. By default, this option is disabled.
set history save off
set history size size
HISTSIZE
, or to 256 if this variable is not set.
History expansion assigns special meaning to the character !.
Since ! is also the logical not operator in C, history expansion
is off by default. If you decide to enable history expansion with the
set history expansion on
command, you may sometimes need to
follow ! (when it is used as logical not, in an expression) with
a space or a tab to prevent it from being expanded. The readline
history facilities do not attempt substitution on the strings
!= and !(, even when history expansion is enabled.
The commands to control history expansion are:
set history expansion on
set history expansion
set history expansion off
The readline code comes with more complete documentation of
editing and history expansion features. Users unfamiliar with GNU Emacs
or vi
may wish to read it.
show history
show history filename
show history save
show history size
show history expansion
show history
by itself displays all four states.
show commands
show commands n
show commands +
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Certain commands to GDB may produce large amounts of information output to the screen. To help you read all of it, GDB pauses and asks you for input at the end of each page of output. Type RET when you want to continue the output, or q to discard the remaining output. Also, the screen width setting determines when to wrap lines of output. Depending on what is being printed, GDB tries to break the line at a readable place, rather than simply letting it overflow onto the following line.
Normally GDB knows the size of the screen from the terminal
driver software. For example, on Unix GDB uses the termcap data base
together with the value of the TERM
environment variable and the
stty rows
and stty cols
settings. If this is not correct,
you can override it with the set height
and set
width
commands:
set height lpp
show height
set width cpl
show width
set
commands specify a screen height of lpp lines and
a screen width of cpl characters. The associated show
commands display the current settings.
If you specify a height of zero lines, GDB does not pause during output no matter how long the output is. This is useful if output is to a file or to an editor buffer.
Likewise, you can specify `set width 0' to prevent GDB from wrapping its output.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can always enter numbers in octal, decimal, or hexadecimal in
GDB by the usual conventions: octal numbers begin with
`0', decimal numbers end with `.', and hexadecimal numbers
begin with `0x'. Numbers that begin with none of these are, by
default, entered in base 10; likewise, the default display for
numbers--when no particular format is specified--is base 10. You can
change the default base for both input and output with the set
radix
command.
set input-radix base
set radix 012
set radix 10.
set radix 0xa
sets the base to decimal. On the other hand, `set radix 10'
leaves the radix unchanged no matter what it was.
set output-radix base
show input-radix
show output-radix
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, GDB is silent about its inner workings. If you are
running on a slow machine, you may want to use the set verbose
command. This makes GDB tell you when it does a lengthy
internal operation, so you will not think it has crashed.
Currently, the messages controlled by set verbose
are those
which announce that the symbol table for a source file is being read;
see symbol-file
in Files.
set verbose on
set verbose off
show verbose
set verbose
is on or off.
By default, if GDB encounters bugs in the symbol table of an object file, it is silent; but if you are debugging a compiler, you may find this information useful (see Symbol Errors).
set complaints limit
show complaints
By default, GDB is cautious, and asks what sometimes seems to be a lot of stupid questions to confirm certain commands. For example, if you try to run a program which is already running:
(gdb) run The program being debugged has been started already. Start it from the beginning? (y or n)If you are willing to unflinchingly face the consequences of your own commands, you can disable this "feature":
set confirm off
set confirm on
show confirm
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Aside from breakpoint commands (see Break Commands), GDB provides two ways to store sequences of commands for execution as a unit: user-defined commands and command files.
Define User-defined commands Hooks User-defined command hooks Command Files Command files Output Commands for controlled output
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A user-defined command is a sequence of GDB commands to
which you assign a new name as a command. This is done with the
define
command. User commands may accept up to 10 arguments
separated by white space. Arguments are accessed within the user command
via $arg0...$arg9. A trivial example:
define adder
print $arg0 + $arg1 + $arg2
To execute the command use:
adder 1 2 3
This defines the command adder
, which prints the sum of
its three arguments. Note the arguments are text substitutions, so they may
reference variables, use complex expressions, or even perform inferior
functions calls.
define commandname
The definition of the command is made up of other GDB command lines,
which are given following the define
command. The end of these
commands is marked by a line containing end
.
if
else
, followed
by a series of commands that are only executed if the expression
was false. The end of the list is marked by a line containing end
.
while
if
: the command takes a single argument,
which is an expression to evaluate, and must be followed by the commands to
execute, one per line, terminated by an end
.
The commands are executed repeatedly as long as the expression
evaluates to true.
document commandname
help
. The command commandname must already be
defined. This command reads lines of documentation just as define
reads the lines of the command definition, ending with end
.
After the document
command is finished, help
on command
commandname displays the documentation you have written.
You may use the document
command again to change the
documentation of a command. Redefining the command with define
does not change the documentation.
help user-defined
show user
show user commandname
When user-defined commands are executed, the commands of the definition are not printed. An error in any command stops execution of the user-defined command.
If used interactively, commands that would ask for confirmation proceed without asking when used inside a user-defined command. Many GDB commands that normally print messages to say what they are doing omit the messages when used in a user-defined command.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You may define hooks, which are a special kind of user-defined command. Whenever you run the command `foo', if the user-defined command `hook-foo' exists, it is executed (with no arguments) before that command.
In addition, a pseudo-command, `stop' exists. Defining (`hook-stop') makes the associated commands execute every time execution stops in your program: before breakpoint commands are run, displays are printed, or the stack frame is printed.
For example, to ignore SIGALRM
signals while
single-stepping, but treat them normally during normal execution,
you could define:
define hook-stop handle SIGALRM nopass end define hook-run handle SIGALRM pass end define hook-continue handle SIGLARM pass endYou can define a hook for any single-word command in GDB, but not for command aliases; you should define a hook for the basic command name, e.g.
backtrace
rather than bt
.
If an error occurs during the execution of your hook, execution of
GDB commands stops and GDB issues a prompt
(before the command that you actually typed had a chance to run).
If you try to define a hook which does not match any known command, you
get a warning from the define
command.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A command file for GDB is a file of lines that are GDB commands. Comments (lines starting with #) may also be included. An empty line in a command file does nothing; it does not mean to repeat the last command, as it would from the terminal.
When you start GDB, it automatically executes commands from its
init files. These are files named `.gdbinit' on Unix, or
`gdb.ini' on DOS/Windows. GDB reads the init file (if
any) in your home directory(4), then processes command line options and operands, and then
reads the init file (if any) in the current working directory. This is
so the init file in your home directory can set options (such as
set complaints
) which affect the processing of the command line
options and operands. The init files are not executed if you use the
`-nx' option; see Mode Options.
It can be useful to create a `.gdbinit' file in the directory where you are debugging an application. This file will set the set of actions that apply for this application.
For example, one might add lines like:
dir /usr/src/path/to/source/filesto add source directories or:
break fatalto set breakpoints on fatal error routines or diagnostic routines.
On some configurations of GDB, the init file is known by a different name (these are typically environments where a specialized form of GDB may need to coexist with other forms, hence a different name for the specialized version's init file). These are the environments with special init file names:
source
command:
source filename
The lines in a command file are executed sequentially. They are not printed as they are executed. An error in any command terminates execution of the command file.
Commands that would ask for confirmation if used interactively proceed without asking when used in a command file. Many GDB commands that normally print messages to say what they are doing omit the messages when called from command files.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
During the execution of a command file or a user-defined command, normal GDB output is suppressed; the only output that appears is what is explicitly printed by the commands in the definition. This section describes three commands useful for generating exactly the output you want.
echo text
A backslash at the end of text can be used, as in C, to continue the command onto subsequent lines. For example,
echo This is some text\n\ which is continued\n\ onto several lines.\nproduces the same output as
echo This is some text\n echo which is continued\n echo onto several lines.\n
output expression
output/fmt expression
print
. See Output Formats, for more information.
printf string, expressions...
printf (string, expressions...);For example, you can print two values in hex like this:
printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-foo
The only backslash-escape sequences that you can use in the format
string are the simple ones that consist of backslash followed by a
letter.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A special interface allows you to use GNU Emacs to view (and edit) the source files for the program you are debugging with GDB.
To use this interface, use the command M-x gdb in Emacs. Give the
executable file you want to debug as an argument. This command starts
GDB as a subprocess of Emacs, with input and output through a newly
created Emacs buffer.
(Do not use the -tui
option to run GDB from Emacs.)
Using GDB under Emacs is just like using GDB normally except for two things:
This is useful because it means that you can copy the text of previous commands and input them again; you can even use parts of the output in this way.
All the facilities of Emacs' Shell mode are available for interacting with your program. In particular, you can send signals the usual way--for example, C-c C-c for an interrupt, C-c C-z for a stop.
Explicit GDB list
or search commands still produce output as
usual, but you probably have no reason to use them from Emacs.
Warning: If the directory where your program resides is not your current directory, it can be easy to confuse Emacs about the location of the source files, in which case the auxiliary display buffer does not appear to show your source. GDB can find programs by searching your environment'sBy default, M-x gdb calls the program called `gdb'. If you need to call GDB by a different name (for example, if you keep several configurations around, with different names) you can set the Emacs variablePATH
variable, so the GDB input and output session proceeds normally; but Emacs does not get enough information back from GDB to locate the source files in this situation. To avoid this problem, either start GDB mode from the directory where your program resides, or specify an absolute file name when prompted for the M-x gdb argument.A similar confusion can result if you use the GDB
file
command to switch to debugging a program in some other location, from an existing GDB buffer in Emacs.
gdb-command-name
; for example,
(setq gdb-command-name "mygdb")(preceded by M-: or ESC :, or typed in the
*scratch*
buffer, or
in your `.emacs' file) makes Emacs call the program named
"mygdb
" instead.
In the GDB I/O buffer, you can use these special Emacs commands in addition to the standard Shell mode commands:
step
command; also
update the display window to show the current file and location.
next
command. Then update the display window
to show the current file and location.
stepi
command; update
display window accordingly.
nexti
command; update
display window accordingly.
finish
command.
continue
command.
Warning: In Emacs v19, this command is C-c C-p.
up
command.
Warning: In Emacs v19, this command is C-c C-u.
down
command.
Warning: In Emacs v19, this command is C-c C-d.
disassemble
by typing C-x &.
You can customize this further by defining elements of the list
gdb-print-command
; once it is defined, you can format or
otherwise process numbers picked up by C-x & before they are
inserted. A numeric argument to C-x & indicates that you
wish special formatting, and also acts as an index to pick an element of the
list. If the list element is a string, the number to be inserted is
formatted using the Emacs function format
; otherwise the number
is passed as an argument to the corresponding list element.
In any source file, the Emacs command C-x SPC (gdb-break
)
tells GDB to set a breakpoint on the source line point is on.
If you accidentally delete the source-display buffer, an easy way to get
it back is to type the command f
in the GDB buffer, to
request a frame display; when you run under Emacs, this recreates
the source buffer if necessary to show you the context of the current
frame.
The source files displayed in Emacs are in ordinary Emacs buffers which are visiting the source files in the usual way. You can edit the files with these buffers if you wish; but keep in mind that GDB communicates with Emacs in terms of line numbers. If you add or delete lines from the text, the line numbers that GDB knows cease to correspond properly with the code.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Your bug reports play an essential role in making GDB reliable.
Reporting a bug may help you by bringing a solution to your problem, or it may not. But in any case the principal function of a bug report is to help the entire community by making the next version of GDB work better. Bug reports are your contribution to the maintenance of GDB.
In order for a bug report to serve its purpose, you must include the information that enables us to fix the bug.
Bug Criteria Have you found a bug? Bug Reporting How to report bugs
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you are not sure whether you have found a bug, here are some guidelines:
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you obtained GDB (Hewlett-Packard Wildebeest (based on GDB 4.17-hpwdb-980821)) as part of your HP ANSI C, HP ANSI C++, or HP Fortran compiler kit, report problems to your HP Support Representative.
If you obtained GDB (Hewlett-Packard Wildebeest (based on GDB 4.17-hpwdb-980821)) from the Hewlett-Packard Web site, report problems to your HP Support Representative. Support is covered under the support contract for your HP compiler.
The fundamental principle of reporting bugs usefully is this: report all the facts. If you are not sure whether to state a fact or leave it out, state it!
Often people omit facts because they think they know what causes the problem and assume that some details do not matter. Thus, you might assume that the name of the variable you use in an example does not matter. Well, probably it does not, but one cannot be sure. Perhaps the bug is a stray memory reference which happens to fetch from the location where that name is stored in memory; perhaps, if the name were different, the contents of that location would fool the debugger into doing the right thing despite the bug. Play it safe and give a specific, complete example. That is the easiest thing for you to do, and the most helpful.
Keep in mind that the purpose of a bug report is to enable us to fix the bug. It may be that the bug has been reported previously, but neither you nor we can know that unless your bug report is complete and self-contained.
Sometimes people give a few sketchy facts and ask, "Does this ring a bell?" Those bug reports are useless, and we urge everyone to refuse to respond to them except to chide the sender to report bugs properly.
To enable us to fix the bug, you should include all these things:
show
version
.
Without this, we will not know whether there is any point in looking for the bug in the current version of GDB.
what
command with the pathname of the compile command
(`what /opt/ansic/bin/cc', for example) to obtain this information.
If we were to try to guess the arguments, we would probably guess wrong and then we might not encounter the bug.
Of course, if the bug is that GDB gets a fatal signal, then we will certainly notice it. But if the bug is incorrect output, we might not notice unless it is glaringly wrong. You might as well not give us a chance to make a mistake.
Even if the problem you experience is a fatal signal, you should still say so explicitly. Suppose something strange is going on, such as, your copy of GDB is out of synch, or you have encountered a bug in the C library on your system. (This has happened!) Your copy might crash and ours would not. If you told us to expect a crash, then when ours fails to crash, we would know that the bug was not happening for us. If you had not told us to expect a crash, then we would not be able to draw any conclusion from our observations.
Often people who encounter a bug spend a lot of time investigating which changes to the input file will make the bug go away and which changes will not affect it.
This is often time consuming and not very useful, because the way we will find the bug is by running a single example under the debugger with breakpoints, not by pure deduction from a series of examples. We recommend that you save your time for something else.
Of course, if you can find a simpler example to report instead of the original one, that is a convenience for us. Errors in the output will be easier to spot, running under the debugger will take less time, and so on.
However, simplification is not vital; if you do not want to do this, report the bug anyway and send us the entire test case you used.
A patch for the bug does help us if it is a good one. But do not omit the necessary information, such as the test case, on the assumption that a patch is all we need. We might see problems with your patch and decide to fix the problem another way, or we might not understand it at all.
Sometimes with a program as complicated as GDB it is very hard to construct an example that will make the program follow a certain path through the code. If you do not send us the example, we will not be able to construct one, so we will not be able to verify that the bug is fixed.
And if we cannot understand what bug you are trying to fix, or why your patch should be an improvement, we will not install it. A test case will help us to understand.
Such guesses are usually wrong. Even we cannot guess right about such things without first using the debugger to find the facts.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes the basic features of the GNU command line editing interface.
Introduction and Notation Notation used in this text. Readline Interaction The minimum set of commands for editing a line. Readline Init File Customizing Readline from a user's view. Bindable Readline Commands A description of most of the Readline commands available for binding Readline vi Mode A short description of how to make Readline behave like the vi editor.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following paragraphs describe the notation used to represent keystrokes.
The text C-k is read as `Control-K' and describes the character produced when the k key is pressed while the Control key is depressed.
The text M-k is read as `Meta-K' and describes the character produced when the meta key (if you have one) is depressed, and the k key is pressed. If you do not have a meta key, the identical keystroke can be generated by typing ESC first, and then typing k. Either process is known as metafying the k key.
The text M-C-k is read as `Meta-Control-k' and describes the character produced by metafying C-k.
In addition, several keys have their own names. Specifically, DEL, ESC, LFD, SPC, RET, and TAB all stand for themselves when seen in this text, or in an init file (see Readline Init File).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Often during an interactive session you type in a long line of text, only to notice that the first word on the line is misspelled. The Readline library gives you a set of commands for manipulating the text as you type it in, allowing you to just fix your typo, and not forcing you to retype the majority of the line. Using these editing commands, you move the cursor to the place that needs correction, and delete or insert the text of the corrections. Then, when you are satisfied with the line, you simply press RETURN. You do not have to be at the end of the line to press RETURN; the entire line is accepted regardless of the location of the cursor within the line.
Readline Bare Essentials The least you need to know about Readline. Readline Movement Commands Moving about the input line. Readline Killing Commands How to delete text, and how to get it back! Readline Arguments Giving numeric arguments to commands. Searching Searching through previous lines.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In order to enter characters into the line, simply type them. The typed character appears where the cursor was, and then the cursor moves one space to the right. If you mistype a character, you can use your erase character to back up and delete the mistyped character.
Sometimes you may miss typing a character that you wanted to type, and not notice your error until you have typed several other characters. In that case, you can type C-b to move the cursor to the left, and then correct your mistake. Afterwards, you can move the cursor to the right with C-f.
When you add text in the middle of a line, you will notice that characters to the right of the cursor are `pushed over' to make room for the text that you have inserted. Likewise, when you delete text behind the cursor, characters to the right of the cursor are `pulled back' to fill in the blank space created by the removal of the text. A list of the basic bare essentials for editing the text of an input line follows.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The above table describes the most basic possible keystrokes that you need in order to do editing of the input line. For your convenience, many other commands have been added in addition to C-b, C-f, C-d, and DEL. Here are some commands for moving more rapidly about the line.
Notice how C-f moves forward a character, while M-f moves forward a word. It is a loose convention that control keystrokes operate on characters while meta keystrokes operate on words.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Killing text means to delete the text from the line, but to save it away for later use, usually by yanking (re-inserting) it back into the line. If the description for a command says that it `kills' text, then you can be sure that you can get the text back in a different (or the same) place later.
When you use a kill command, the text is saved in a kill-ring. Any number of consecutive kills save all of the killed text together, so that when you yank it back, you get it all. The kill ring is not line specific; the text that you killed on a previously typed line is available to be yanked back later, when you are typing another line.
Here is the list of commands for killing text.
Here is how to yank the text back into the line. Yanking means to copy the most-recently-killed text from the kill buffer.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can pass numeric arguments to Readline commands. Sometimes the argument acts as a repeat count, other times it is the sign of the argument that is significant. If you pass a negative argument to a command which normally acts in a forward direction, that command will act in a backward direction. For example, to kill text back to the start of the line, you might type `M-- C-k'.
The general way to pass numeric arguments to a command is to type meta digits before the command. If the first `digit' typed is a minus sign (-), then the sign of the argument will be negative. Once you have typed one meta digit to get the argument started, you can type the remainder of the digits, and then the command. For example, to give the C-d command an argument of 10, you could type `M-1 0 C-d'.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Readline provides commands for searching through the command history for lines containing a specified string. There are two search modes: incremental and non-incremental.
Incremental searches begin before the user has finished typing the search string. As each character of the search string is typed, Readline displays the next entry from the history matching the string typed so far. An incremental search requires only as many characters as needed to find the desired history entry. The characters present in the value of the isearch-terminators variable are used to terminate an incremental search. If that variable has not been assigned a value, the ESC and C-J characters will terminate an incremental search. C-g will abort an incremental search and restore the original line. When the search is terminated, the history entry containing the search string becomes the current line. To find other matching entries in the history list, type C-s or C-r as appropriate. This will search backward or forward in the history for the next entry matching the search string typed so far. Any other key sequence bound to a Readline command will terminate the search and execute that command. For instance, a RET will terminate the search and accept the line, thereby executing the command from the history list.
Non-incremental searches read the entire search string before starting to search for matching history lines. The search string may be typed by the user or be part of the contents of the current line.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Although the Readline library comes with a set of emacs
-like
keybindings installed by default, it is possible to use a different set
of keybindings.
Any user can customize programs that use Readline by putting
commands in an inputrc file in his home directory.
The name of this
file is taken from the value of the environment variable INPUTRC
. If
that variable is unset, the default is `~/.inputrc'.
When a program which uses the Readline library starts up, the init file is read, and the key bindings are set.
In addition, the C-x C-r
command re-reads this init file, thus
incorporating any changes that you might have made to it.
Readline Init File Syntax Syntax for the commands in the inputrc file. Conditional Init Constructs Conditional key bindings in the inputrc file. Sample Init File An example inputrc file.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are only a few basic constructs allowed in the Readline init file. Blank lines are ignored. Lines beginning with a `#' are comments. Lines beginning with a `$' indicate conditional constructs (see Conditional Init Constructs). Other lines denote variable settings and key bindings.
set
command within the init file. Here is how to
change from the default Emacs-like key binding to use
vi
line editing commands:
set editing-mode viA great deal of run-time behavior is changeable with the following variables.
bell-style
comment-begin
insert-comment
command is executed. The default value
is "#"
.
completion-ignore-case
completion-query-items
100
.
convert-meta
disable-completion
self-insert
. The default is `off'.
editing-mode
editing-mode
variable controls which default set of
key bindings is used. By default, Readline starts up in Emacs editing
mode, where the keystrokes are most similar to Emacs. This variable can be
set to either `emacs' or `vi'.
enable-keypad
expand-tilde
horizontal-scroll-mode
input-meta
meta-flag
is a
synonym for this variable.
isearch-terminators
keymap
keymap
names are
emacs
,
emacs-standard
,
emacs-meta
,
emacs-ctlx
,
vi
,
vi-command
, and
vi-insert
.
vi
is equivalent to vi-command
; emacs
is
equivalent to emacs-standard
. The default value is emacs
.
The value of the editing-mode
variable also affects the
default keymap.
mark-directories
mark-modified-lines
output-meta
print-completions-horizontally
show-all-if-ambiguous
visible-stats
Once you know the name of the command, simply place the name of the key you wish to bind the command to, a colon, and then the name of the command on a line in the init file. The name of the key can be expressed in different ways, depending on which is most comfortable for you.
Control-u: universal-argument Meta-Rubout: backward-kill-word Control-o: "> output"In the above example, C-u is bound to the function
universal-argument
, and C-o is bound to run the macro
expressed on the right hand side (that is, to insert the text
`> output' into the line).
"\C-u": universal-argument "\C-x\C-r": re-read-init-file "\e[11~": "Function Key 1"In the above example, C-u is bound to the function
universal-argument
(just as it was in the first example),
`C-x C-r' is bound to the function re-read-init-file
,
and `ESC [ 1 1 ~' is bound to insert
the text `Function Key 1'.
The following GNU Emacs style escape sequences are available when specifying key sequences:
\C-
\M-
\e
\\
\"
\'
In addition to the GNU Emacs style escape sequences, a second set of backslash escapes is available:
\a
\b
\d
\f
\n
\r
\t
\v
\nnn
\xnnn
When entering the text of a macro, single or double quotes must be used to indicate a macro definition. Unquoted text is assumed to be a function name. In the macro body, the backslash escapes described above are expanded. Backslash will quote any other character in the macro text, including `"' and `''. For example, the following binding will make `C-x \' insert a single `\' into the line:
"\C-x\\": "\\"
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Readline implements a facility similar in spirit to the conditional compilation features of the C preprocessor which allows key bindings and variable settings to be performed as the result of tests. There are four parser directives used.
$if
$if
construct allows bindings to be made based on the
editing mode, the terminal being used, or the application using
Readline. The text of the test extends to the end of the line;
no characters are required to isolate it.
mode
mode=
form of the $if
directive is used to test
whether Readline is in emacs
or vi
mode.
This may be used in conjunction
with the `set keymap' command, for instance, to set bindings in
the emacs-standard
and emacs-ctlx
keymaps only if
Readline is starting out in emacs
mode.
term
term=
form may be used to include terminal-specific
key bindings, perhaps to bind the key sequences output by the
terminal's function keys. The word on the right side of the
`=' is tested against both the full name of the terminal and
the portion of the terminal name before the first `-'. This
allows sun
to match both sun
and sun-cmd
,
for instance.
application
$if Bash # Quote the current or previous word "\C-xq": "\eb\"\ef\"" $endif
$endif
$if
command.
$else
$if
directive are executed if
the test fails.
$include
$include /etc/inputrc
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is an example of an inputrc file. This illustrates key binding, variable assignment, and conditional syntax.
# This file controls the behaviour of line input editing for # programs that use the Gnu Readline library. Existing programs # include FTP, Bash, and Gdb. # # You can re-read the inputrc file with C-x C-r. # Lines beginning with '#' are comments. # # First, include any systemwide bindings and variable assignments from # /etc/Inputrc $include /etc/Inputrc # # Set various bindings for emacs mode. set editing-mode emacs $if mode=emacs Meta-Control-h: backward-kill-word Text after the function name is ignored # # Arrow keys in keypad mode # #"\M-OD": backward-char #"\M-OC": forward-char #"\M-OA": previous-history #"\M-OB": next-history # # Arrow keys in ANSI mode # "\M-[D": backward-char "\M-[C": forward-char "\M-[A": previous-history "\M-[B": next-history # # Arrow keys in 8 bit keypad mode # #"\M-\C-OD": backward-char #"\M-\C-OC": forward-char #"\M-\C-OA": previous-history #"\M-\C-OB": next-history # # Arrow keys in 8 bit ANSI mode # #"\M-\C-[D": backward-char #"\M-\C-[C": forward-char #"\M-\C-[A": previous-history #"\M-\C-[B": next-history C-q: quoted-insert $endif # An old-style binding. This happens to be the default. TAB: complete # Macros that are convenient for shell interaction $if Bash # edit the path "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f" # prepare to type a quoted word -- insert open and close double quotes # and move to just after the open quote "\C-x\"": "\"\"\C-b" # insert a backslash (testing backslash escapes in sequences and macros) "\C-x\\": "\\" # Quote the current or previous word "\C-xq": "\eb\"\ef\"" # Add a binding to refresh the line, which is unbound "\C-xr": redraw-current-line # Edit variable on current line. "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y=" $endif # use a visible bell if one is available set bell-style visible # don't strip characters to 7 bits when reading set input-meta on # allow iso-latin1 characters to be inserted rather than converted to # prefix-meta sequences set convert-meta off # display characters with the eighth bit set directly rather than # as meta-prefixed characters set output-meta on # if there are more than 150 possible completions for a word, ask the # user if he wants to see all of them set completion-query-items 150 # For FTP $if Ftp "\C-xg": "get \M-?" "\C-xt": "put \M-?" "\M-.": yank-last-arg $endif
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Commands For Moving Moving about the line. Commands For History Getting at previous lines. Commands For Text Commands for changing text. Commands For Killing Commands for killing and yanking. Numeric Arguments Specifying numeric arguments, repeat counts. Commands For Completion Getting Readline to do the typing for you. Keyboard Macros Saving and re-executing typed characters Miscellaneous Commands Other miscellaneous commands.
This section describes Readline commands that may be bound to key sequences.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
beginning-of-line (C-a)
end-of-line (C-e)
forward-char (C-f)
backward-char (C-b)
forward-word (M-f)
backward-word (M-b)
clear-screen (C-l)
redraw-current-line ()
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
accept-line (Newline, Return)
previous-history (C-p)
next-history (C-n)
beginning-of-history (M-<)
end-of-history (M->)
reverse-search-history (C-r)
forward-search-history (C-s)
non-incremental-reverse-search-history (M-p)
non-incremental-forward-search-history (M-n)
history-search-forward ()
history-search-backward ()
yank-nth-arg (M-C-y)
yank-last-arg (M-., M-_)
yank-nth-arg
.
Successive calls to yank-last-arg
move back through the history
list, inserting the last argument of each line in turn.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
delete-char (C-d)
delete-char
, then
return EOF
.
backward-delete-char (Rubout)
forward-backward-delete-char ()
quoted-insert (C-q, C-v)
tab-insert (M-TAB)
self-insert (a, b, A, 1, !, ...)
transpose-chars (C-t)
transpose-words (M-t)
upcase-word (M-u)
downcase-word (M-l)
capitalize-word (M-c)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
kill-line (C-k)
backward-kill-line (C-x Rubout)
unix-line-discard (C-u)
kill-whole-line ()
kill-word (M-d)
forward-word
.
backward-kill-word (M-DEL)
backward-word
.
unix-word-rubout (C-w)
delete-horizontal-space ()
kill-region ()
copy-region-as-kill ()
copy-backward-word ()
backward-word
.
By default, this command is unbound.
copy-forward-word ()
forward-word
.
By default, this command is unbound.
yank (C-y)
yank-pop (M-y)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
digit-argument (M-0, M-1, ... M--)
universal-argument ()
universal-argument
again ends the numeric argument, but is otherwise ignored.
As a special case, if this command is immediately followed by a
character that is neither a digit or minus sign, the argument count
for the next command is multiplied by four.
The argument count is initially one, so executing this function the
first time makes the argument count four, a second time makes the
argument count sixteen, and so on.
By default, this is not bound to a key.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
complete (TAB)
possible-completions (M-?)
insert-completions (M-*)
possible-completions
.
menu-complete ()
complete
, but replaces the word to be completed
with a single match from the list of possible completions.
Repeated execution of menu-complete
steps through the list
of possible completions, inserting each match in turn.
At the end of the list of completions, the bell is rung and the
original text is restored.
An argument of n moves n positions forward in the list
of matches; a negative argument may be used to move backward
through the list.
This command is intended to be bound to TAB
, but is unbound
by default.
delete-char-or-list ()
delete-char
).
If at the end of the line, behaves identically to
possible-completions
.
This command is unbound by default.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
start-kbd-macro (C-x ()
end-kbd-macro (C-x ))
call-last-kbd-macro (C-x e)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
re-read-init-file (C-x C-r)
abort (C-g)
bell-style
).
do-uppercase-version (M-a, M-b, M-x, ...)
prefix-meta (ESC)
undo (C-_, C-x C-u)
revert-line (M-r)
undo
command enough times to get back to the beginning.
tilde-expand (M-~)
set-mark (C-@)
exchange-point-and-mark (C-x C-x)
character-search (C-])
character-search-backward (M-C-])
insert-comment (M-#)
comment-begin
variable is inserted at the beginning of the current line,
and the line is accepted as if a newline had been typed.
dump-functions ()
dump-variables ()
dump-macros ()
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
While the Readline library does not have a full set of vi
editing functions, it does contain enough to allow simple editing
of the line. The Readline vi
mode behaves as specified in
the POSIX 1003.2 standard.
In order to switch interactively between emacs
and vi
editing modes, use the command M-C-j (toggle-editing-mode).
The Readline default is emacs
mode.
When you enter a line in vi
mode, you are already placed in
`insertion' mode, as if you had typed an `i'. Pressing ESC
switches you into `command' mode, where you can edit the text of the
line with the standard vi
movement keys, move to previous
history lines with `k' and subsequent lines with `j', and
so forth.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes how to use the GNU History Library interactively, from a user's standpoint. It should be considered a user's guide.
History Interaction What it feels like using History as a user.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The History library provides a history expansion feature that is similar
to the history expansion provided by csh
. This section
describes the syntax used to manipulate the history information.
History expansions introduce words from the history list into the input stream, making it easy to repeat commands, insert the arguments to a previous command into the current input line, or fix errors in previous commands quickly.
History expansion takes place in two parts. The first is to determine which line from the history list should be used during substitution. The second is to select portions of that line for inclusion into the current one. The line selected from the history is called the event, and the portions of that line that are acted upon are called words. Various modifiers are available to manipulate the selected words. The line is broken into words in the same fashion that Bash does, so that several words surrounded by quotes are considered one word. History expansions are introduced by the appearance of the history expansion character, which is `!' by default.
Event Designators How to specify which history line to use. Word Designators Specifying which words are of interest. Modifiers Modifying the results of substitution.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An event designator is a reference to a command line entry in the history list.
!
!n
!-n
!!
!string
!?string[?]
^string1^string2^
!!:s/string1/string2/
.
!#
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Word designators are used to select desired words from the event. A `:' separates the event specification from the word designator. It may be omitted if the word designator begins with a `^', `$', `*', `-', or `%'. Words are numbered from the beginning of the line, with the first word being denoted by 0 (zero). Words are inserted into the current line separated by single spaces.
0 (zero)
0
th word. For many applications, this is the command word.
n
^
$
%
x-y
*
0
th. This is a synonym for `1-$'.
It is not an error to use `*' if there is just one word in the event;
the empty string is returned in that case.
x*
x-
If a word designator is supplied without an event specification, the previous command is used as the event.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
After the optional word designator, you can add a sequence of one or more of the following modifiers, each preceded by a `:'.
h
t
r
e
p
s/old/new/
&
g
gs/old/new/
,
or with `&'.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you obtain GDB (HP WDB 2.0) as part of the HP ANSI C, HP ANSI C++ Developer's Kit for HP-UX Release 11.0, or HP Fortran, you do not have to take any special action to build or install GDB.
If you obtain GDB (HP WDB 2.0) from an HP web site, you may
download either an swinstall
package or a source tree, or
both.
Most customers will want to install the GDB binary that is part
of the swinstall
package. To do so, use a command of the
form
/usr/sbin/swinstall -s package-name WDB
Alternatively, it is possible to build GDB from the source
distribution. If you who want to modify the debugger
sources to tailor GDB to your needs you may wish to do this.
The source distribution consists of a tar
file containing the
source tree rooted
at `gdb-4.17/...'. The instructions that follow describe how to
build a `gdb' executable from this source tree. HP believes that
these instructions apply to the HP WDB 2.0 source tree that it distributes.
However, HP does not explicitly support building a `gdb' for any
non-HP platform from the HP WDB 2.0 source tree. It may work, but HP has not
tested it for any platforms other than those described in the HP WDB 2.0
Release Notes.
You can find additional information specific to Hewlett-Packard in the `README.HP.WDB' file at the root of the source tree.
GDB comes with a configure
script that automates the process
of preparing GDB for installation; you can then use make
to
build the gdb
program.
The GDB distribution includes all the source code you need for GDB in a single directory, whose name is usually composed by appending the version number to `gdb'.
For example, the GDB version 19991101 distribution is in the `gdb-19991101' directory. That directory contains:
gdb-19991101/configure (and supporting files)
gdb-19991101/gdb
gdb-19991101/bfd
gdb-19991101/include
gdb-19991101/libiberty
gdb-19991101/opcodes
gdb-19991101/readline
gdb-19991101/glob
gdb-19991101/mmalloc
The simplest way to configure and build GDB is to run configure
from the `gdb-version-number' source directory, which in
this example is the `gdb-19991101' directory.
First switch to the `gdb-version-number' source directory
if you are not already in it; then run configure
. Pass the
identifier for the platform on which GDB will run as an
argument.
For example:
cd gdb-19991101 ./configure host makewhere host is an identifier such as `sun4' or `decstation', that identifies the platform where GDB will run. (You can often leave off host;
configure
tries to guess the
correct value by examining your system.)
Running `configure host' and then running make
builds the
`bfd', `readline', `mmalloc', and `libiberty'
libraries, then gdb
itself. The configured source files, and the
binaries, are left in the corresponding source directories.
configure
is a Bourne-shell (/bin/sh
) script; if your
system does not recognize this automatically when you run a different
shell, you may need to run sh
on it explicitly:
sh configure hostIf you run
configure
from a directory that contains source
directories for multiple libraries or programs, such as the
`gdb-19991101' source directory for version 19991101, configure
creates configuration files for every directory level underneath (unless
you tell it not to, with the `--norecursion' option).
You can run the configure
script from any of the
subordinate directories in the GDB distribution if you only want to
configure that subdirectory, but be sure to specify a path to it.
For example, with version 19991101, type the following to configure only
the bfd
subdirectory:
cd gdb-19991101/bfd ../configure hostYou can install
gdb
anywhere; it has no hardwired paths.
However, you should make sure that the shell on your path (named by
the `SHELL' environment variable) is publicly readable. Remember
that GDB uses the shell to start your program--some systems refuse to
let GDB debug child processes whose programs are not readable.
Separate Objdir Compiling GDB in another directory Config Names Specifying names for hosts and targets Configure Options Summary of options for configure
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you want to run GDB versions for several host or target machines,
you need a different gdb
compiled for each combination of
host and target. configure
is designed to make this easy by
allowing you to generate each configuration in a separate subdirectory,
rather than in the source directory. If your make
program
handles the `VPATH' feature (GNU make
does), running
make
in each of these directories builds the gdb
program specified there.
To build gdb
in a separate directory, run configure
with the `--srcdir' option to specify where to find the source.
(You also need to specify a path to find configure
itself from your working directory. If the path to configure
would be the same as the argument to `--srcdir', you can leave out
the `--srcdir' option; it is assumed.)
For example, with version 19991101, you can build GDB in a separate directory for a Sun 4 like this:
cd gdb-19991101 mkdir ../gdb-sun4 cd ../gdb-sun4 ../gdb-19991101/configure sun4 makeWhen
configure
builds a configuration using a remote source
directory, it creates a tree for the binaries with the same structure
(and using the same names) as the tree under the source directory. In
the example, you'd find the Sun 4 library `libiberty.a' in the
directory `gdb-sun4/libiberty', and GDB itself in
`gdb-sun4/gdb'.
One popular reason to build several GDB configurations in separate
directories is to configure GDB for cross-compiling (where
GDB runs on one machine--the host---while debugging
programs that run on another machine--the target).
You specify a cross-debugging target by
giving the `--target=target' option to configure
.
When you run make
to build a program or library, you must run
it in a configured directory--whatever directory you were in when you
called configure
(or one of its subdirectories).
The Makefile
that configure
generates in each source
directory also runs recursively. If you type make
in a source
directory such as `gdb-19991101' (or in a separate configured
directory configured with `--srcdir=dirname/gdb-19991101'), you
will build all the required libraries, and then build GDB.
When you have multiple hosts or targets configured in separate
directories, you can run make
on them in parallel (for example,
if they are NFS-mounted on each of the hosts); they will not interfere
with each other.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The specifications used for hosts and targets in the configure
script are based on a three-part naming scheme, but some short predefined
aliases are also supported. The full naming scheme encodes three pieces
of information in the following pattern:
architecture-vendor-osFor example, you can use the alias
sun4
as a host argument,
or as the value for target in a --target=target
option. The equivalent full name is `sparc-sun-sunos4'.
The configure
script accompanying GDB does not provide
any query facility to list all supported host and target names or
aliases. configure
calls the Bourne shell script
config.sub
to map abbreviations to full names; you can read the
script, if you wish, or you can use it to test your guesses on
abbreviations--for example:
% sh config.sub i386-linux
i386-pc-linux-gnu
% sh config.sub alpha-linux
alpha-unknown-linux-gnu
% sh config.sub hp9k700
hppa1.1-hp-hpux
% sh config.sub sun4
sparc-sun-sunos4.1.1
% sh config.sub sun3
m68k-sun-sunos4.1.1
% sh config.sub i986v
Invalid configuration `i986v': machine `i986v' not recognized
config.sub
is also distributed in the GDB source
directory (`gdb-19991101', for version 19991101).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
configure
options
Here is a summary of the configure
options and arguments that
are most often useful for building GDB. configure
also has
several other options not listed here. See Info file `configure.info', node `What Configure Does', for a full explanation of configure
.
configure [--help] [--prefix=dir] [--exec-prefix=dir] [--srcdir=dirname] [--norecursion] [--rm] [--target=target] hostYou may introduce options with a single `-' rather than `--' if you prefer; but you may abbreviate option names if you use `--'.
--help
configure
.
--prefix=dir
--exec-prefix=dir
--srcdir=dirname
make
, or another
make
that implements the VPATH
feature.configure
writes configuration specific files in
the current directory, but arranges for them to use the source in the
directory dirname. configure
creates directories under
the working directory in parallel to the source directories below
dirname.
--norecursion
configure
is executed; do not
propagate configuration to subdirectories.
--target=target
There is no convenient way to generate a list of all available targets.
host ...
There is no convenient way to generate a list of all available hosts.
There are many other options available as well, but they are generally
needed for special purposes only.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[Top] | [Contents] | [Index] | [ ? ] |
`b' cannot be used because these format letters are also
used with the x
command, where `b' stands for "byte";
see Memory.
This is a way of removing
one word from the stack, on machines where stacks grow downward in
memory (most machines, nowadays). This assumes that the innermost
stack frame is selected; setting $sp
is not allowed when other
stack frames are selected. To pop entire frames off the stack,
regardless of machine architecture, use return
;
see Returning.
If a procedure call is used for instance in an expression, then this procedure is called with all its side effects. This can lead to confusing results if used carelessly.
On DOS/Windows systems, the home
directory is the one pointed to by the HOME
environment
variable.
[Top] | [Contents] | [Index] | [ ? ] |
::
and .
configure
options
[Top] | [Contents] | [Index] | [ ? ] |
[Top] | [Contents] | [Index] | [ ? ] |
Button | Name | Go to | From 1.2.3 go to |
---|---|---|---|
[ < ] | Back | previous section in reading order | 1.2.2 |
[ > ] | Forward | next section in reading order | 1.2.4 |
[ << ] | FastBack | previous or up-and-previous section | 1.1 |
[ Up ] | Up | up section | 1.2 |
[ >> ] | FastForward | next or up-and-next section | 1.3 |
[Top] | Top | cover (top) of document | |
[Contents] | Contents | table of contents | |
[Index] | Index | concept index | |
[ ? ] | About | this page |