7080 lines
282 KiB
Plaintext
Executable File
7080 lines
282 KiB
Plaintext
Executable File
This is gdb.info, produced by makeinfo version 5.2 from gdb.texinfo.
|
||
|
||
Copyright (C) 1988-2014 Free Software Foundation, Inc.
|
||
|
||
Permission is granted to copy, distribute and/or modify this document
|
||
under the terms of the GNU Free Documentation License, Version 1.3 or
|
||
any later version published by the Free Software Foundation; with the
|
||
Invariant Sections being "Free Software" and "Free Software Needs Free
|
||
Documentation", with the Front-Cover Texts being "A GNU Manual," and
|
||
with the Back-Cover Texts as in (a) below.
|
||
|
||
(a) The FSF's Back-Cover Text is: "You are free to copy and modify
|
||
this GNU Manual. Buying copies from GNU Press supports the FSF in
|
||
developing GNU and promoting software freedom."
|
||
INFO-DIR-SECTION Software development
|
||
START-INFO-DIR-ENTRY
|
||
* Gdb: (gdb). The GNU debugger.
|
||
* gdbserver: (gdb) Server. The GNU debugging server.
|
||
END-INFO-DIR-ENTRY
|
||
|
||
This file documents the GNU debugger GDB.
|
||
|
||
This is the Tenth Edition, of 'Debugging with GDB: the GNU
|
||
Source-Level Debugger' for GDB (GDB) Version 7.8.2.
|
||
|
||
Copyright (C) 1988-2014 Free Software Foundation, Inc.
|
||
|
||
Permission is granted to copy, distribute and/or modify this document
|
||
under the terms of the GNU Free Documentation License, Version 1.3 or
|
||
any later version published by the Free Software Foundation; with the
|
||
Invariant Sections being "Free Software" and "Free Software Needs Free
|
||
Documentation", with the Front-Cover Texts being "A GNU Manual," and
|
||
with the Back-Cover Texts as in (a) below.
|
||
|
||
(a) The FSF's Back-Cover Text is: "You are free to copy and modify
|
||
this GNU Manual. Buying copies from GNU Press supports the FSF in
|
||
developing GNU and promoting software freedom."
|
||
|
||
|
||
File: gdb.info, Node: Separate Debug Files, Next: MiniDebugInfo, Prev: Files, Up: GDB Files
|
||
|
||
18.2 Debugging Information in Separate Files
|
||
============================================
|
||
|
||
GDB allows you to put a program's debugging information in a file
|
||
separate from the executable itself, in a way that allows GDB to find
|
||
and load the debugging information automatically. Since debugging
|
||
information can be very large--sometimes larger than the executable code
|
||
itself--some systems distribute debugging information for their
|
||
executables in separate files, which users can install only when they
|
||
need to debug a problem.
|
||
|
||
GDB supports two ways of specifying the separate debug info file:
|
||
|
||
* The executable contains a "debug link" that specifies the name of
|
||
the separate debug info file. The separate debug file's name is
|
||
usually 'EXECUTABLE.debug', where EXECUTABLE is the name of the
|
||
corresponding executable file without leading directories (e.g.,
|
||
'ls.debug' for '/usr/bin/ls'). In addition, the debug link
|
||
specifies a 32-bit "Cyclic Redundancy Check" (CRC) checksum for the
|
||
debug file, which GDB uses to validate that the executable and the
|
||
debug file came from the same build.
|
||
|
||
* The executable contains a "build ID", a unique bit string that is
|
||
also present in the corresponding debug info file. (This is
|
||
supported only on some operating systems, notably those which use
|
||
the ELF format for binary files and the GNU Binutils.) For more
|
||
details about this feature, see the description of the '--build-id'
|
||
command-line option in *note Command Line Options:
|
||
(ld.info)Options. The debug info file's name is not specified
|
||
explicitly by the build ID, but can be computed from the build ID,
|
||
see below.
|
||
|
||
Depending on the way the debug info file is specified, GDB uses two
|
||
different methods of looking for the debug file:
|
||
|
||
* For the "debug link" method, GDB looks up the named file in the
|
||
directory of the executable file, then in a subdirectory of that
|
||
directory named '.debug', and finally under each one of the global
|
||
debug directories, in a subdirectory whose name is identical to the
|
||
leading directories of the executable's absolute file name.
|
||
|
||
* For the "build ID" method, GDB looks in the '.build-id'
|
||
subdirectory of each one of the global debug directories for a file
|
||
named 'NN/NNNNNNNN.debug', where NN are the first 2 hex characters
|
||
of the build ID bit string, and NNNNNNNN are the rest of the bit
|
||
string. (Real build ID strings are 32 or more hex characters, not
|
||
10.)
|
||
|
||
So, for example, suppose you ask GDB to debug '/usr/bin/ls', which
|
||
has a debug link that specifies the file 'ls.debug', and a build ID
|
||
whose value in hex is 'abcdef1234'. If the list of the global debug
|
||
directories includes '/usr/lib/debug', then GDB will look for the
|
||
following debug information files, in the indicated order:
|
||
|
||
- '/usr/lib/debug/.build-id/ab/cdef1234.debug'
|
||
- '/usr/bin/ls.debug'
|
||
- '/usr/bin/.debug/ls.debug'
|
||
- '/usr/lib/debug/usr/bin/ls.debug'.
|
||
|
||
Global debugging info directories default to what is set by GDB
|
||
configure option '--with-separate-debug-dir'. During GDB run you can
|
||
also set the global debugging info directories, and view the list GDB is
|
||
currently using.
|
||
|
||
'set debug-file-directory DIRECTORIES'
|
||
Set the directories which GDB searches for separate debugging
|
||
information files to DIRECTORY. Multiple path components can be
|
||
set concatenating them by a path separator.
|
||
|
||
'show debug-file-directory'
|
||
Show the directories GDB searches for separate debugging
|
||
information files.
|
||
|
||
A debug link is a special section of the executable file named
|
||
'.gnu_debuglink'. The section must contain:
|
||
|
||
* A filename, with any leading directory components removed, followed
|
||
by a zero byte,
|
||
* zero to three bytes of padding, as needed to reach the next
|
||
four-byte boundary within the section, and
|
||
* a four-byte CRC checksum, stored in the same endianness used for
|
||
the executable file itself. The checksum is computed on the
|
||
debugging information file's full contents by the function given
|
||
below, passing zero as the CRC argument.
|
||
|
||
Any executable file format can carry a debug link, as long as it can
|
||
contain a section named '.gnu_debuglink' with the contents described
|
||
above.
|
||
|
||
The build ID is a special section in the executable file (and in
|
||
other ELF binary files that GDB may consider). This section is often
|
||
named '.note.gnu.build-id', but that name is not mandatory. It contains
|
||
unique identification for the built files--the ID remains the same
|
||
across multiple builds of the same build tree. The default algorithm
|
||
SHA1 produces 160 bits (40 hexadecimal characters) of the content for
|
||
the build ID string. The same section with an identical value is
|
||
present in the original built binary with symbols, in its stripped
|
||
variant, and in the separate debugging information file.
|
||
|
||
The debugging information file itself should be an ordinary
|
||
executable, containing a full set of linker symbols, sections, and
|
||
debugging information. The sections of the debugging information file
|
||
should have the same names, addresses, and sizes as the original file,
|
||
but they need not contain any data--much like a '.bss' section in an
|
||
ordinary executable.
|
||
|
||
The GNU binary utilities (Binutils) package includes the 'objcopy'
|
||
utility that can produce the separated executable / debugging
|
||
information file pairs using the following commands:
|
||
|
||
objcopy --only-keep-debug foo foo.debug
|
||
strip -g foo
|
||
|
||
These commands remove the debugging information from the executable file
|
||
'foo' and place it in the file 'foo.debug'. You can use the first,
|
||
second or both methods to link the two files:
|
||
|
||
* The debug link method needs the following additional command to
|
||
also leave behind a debug link in 'foo':
|
||
|
||
objcopy --add-gnu-debuglink=foo.debug foo
|
||
|
||
Ulrich Drepper's 'elfutils' package, starting with version 0.53,
|
||
contains a version of the 'strip' command such that the command
|
||
'strip foo -f foo.debug' has the same functionality as the two
|
||
'objcopy' commands and the 'ln -s' command above, together.
|
||
|
||
* Build ID gets embedded into the main executable using 'ld
|
||
--build-id' or the GCC counterpart 'gcc -Wl,--build-id'. Build ID
|
||
support plus compatibility fixes for debug files separation are
|
||
present in GNU binary utilities (Binutils) package since version
|
||
2.18.
|
||
|
||
The CRC used in '.gnu_debuglink' is the CRC-32 defined in IEEE 802.3
|
||
using the polynomial:
|
||
|
||
x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11}
|
||
+ x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
|
||
|
||
The function is computed byte at a time, taking the least significant
|
||
bit of each byte first. The initial pattern '0xffffffff' is used, to
|
||
ensure leading zeros affect the CRC and the final result is inverted to
|
||
ensure trailing zeros also affect the CRC.
|
||
|
||
_Note:_ This is the same CRC polynomial as used in handling the
|
||
"Remote Serial Protocol" 'qCRC' packet (*note qCRC packet::). However
|
||
in the case of the Remote Serial Protocol, the CRC is computed _most_
|
||
significant bit first, and the result is not inverted, so trailing zeros
|
||
have no effect on the CRC value.
|
||
|
||
To complete the description, we show below the code of the function
|
||
which produces the CRC used in '.gnu_debuglink'. Inverting the
|
||
initially supplied 'crc' argument means that an initial call to this
|
||
function passing in zero will start computing the CRC using
|
||
'0xffffffff'.
|
||
|
||
unsigned long
|
||
gnu_debuglink_crc32 (unsigned long crc,
|
||
unsigned char *buf, size_t len)
|
||
{
|
||
static const unsigned long crc32_table[256] =
|
||
{
|
||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
|
||
0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
|
||
0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
|
||
0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
|
||
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
|
||
0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
|
||
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
|
||
0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
|
||
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
|
||
0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
|
||
0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
|
||
0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
||
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
|
||
0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
|
||
0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
|
||
0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
|
||
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
|
||
0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
|
||
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
|
||
0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
|
||
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
|
||
0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
|
||
0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
|
||
0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
||
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
|
||
0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
|
||
0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
|
||
0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
|
||
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
|
||
0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
|
||
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
|
||
0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
|
||
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
|
||
0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
|
||
0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
|
||
0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
||
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
|
||
0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
|
||
0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
|
||
0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
|
||
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
|
||
0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
|
||
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
|
||
0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
|
||
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
|
||
0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
|
||
0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
|
||
0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
||
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
|
||
0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
|
||
0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
|
||
0x2d02ef8d
|
||
};
|
||
unsigned char *end;
|
||
|
||
crc = ~crc & 0xffffffff;
|
||
for (end = buf + len; buf < end; ++buf)
|
||
crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
|
||
return ~crc & 0xffffffff;
|
||
}
|
||
|
||
This computation does not apply to the "build ID" method.
|
||
|
||
|
||
File: gdb.info, Node: MiniDebugInfo, Next: Index Files, Prev: Separate Debug Files, Up: GDB Files
|
||
|
||
18.3 Debugging information in a special section
|
||
===============================================
|
||
|
||
Some systems ship pre-built executables and libraries that have a
|
||
special '.gnu_debugdata' section. This feature is called
|
||
"MiniDebugInfo". This section holds an LZMA-compressed object and is
|
||
used to supply extra symbols for backtraces.
|
||
|
||
The intent of this section is to provide extra minimal debugging
|
||
information for use in simple backtraces. It is not intended to be a
|
||
replacement for full separate debugging information (*note Separate
|
||
Debug Files::). The example below shows the intended use; however, GDB
|
||
does not currently put restrictions on what sort of debugging
|
||
information might be included in the section.
|
||
|
||
GDB has support for this extension. If the section exists, then it
|
||
is used provided that no other source of debugging information can be
|
||
found, and that GDB was configured with LZMA support.
|
||
|
||
This section can be easily created using 'objcopy' and other standard
|
||
utilities:
|
||
|
||
# Extract the dynamic symbols from the main binary, there is no need
|
||
# to also have these in the normal symbol table.
|
||
nm -D BINARY --format=posix --defined-only \
|
||
| awk '{ print $1 }' | sort > dynsyms
|
||
|
||
# Extract all the text (i.e. function) symbols from the debuginfo.
|
||
# (Note that we actually also accept "D" symbols, for the benefit
|
||
# of platforms like PowerPC64 that use function descriptors.)
|
||
nm BINARY --format=posix --defined-only \
|
||
| awk '{ if ($2 == "T" || $2 == "t" || $2 == "D") print $1 }' \
|
||
| sort > funcsyms
|
||
|
||
# Keep all the function symbols not already in the dynamic symbol
|
||
# table.
|
||
comm -13 dynsyms funcsyms > keep_symbols
|
||
|
||
# Separate full debug info into debug binary.
|
||
objcopy --only-keep-debug BINARY debug
|
||
|
||
# Copy the full debuginfo, keeping only a minimal set of symbols and
|
||
# removing some unnecessary sections.
|
||
objcopy -S --remove-section .gdb_index --remove-section .comment \
|
||
--keep-symbols=keep_symbols debug mini_debuginfo
|
||
|
||
# Drop the full debug info from the original binary.
|
||
strip --strip-all -R .comment BINARY
|
||
|
||
# Inject the compressed data into the .gnu_debugdata section of the
|
||
# original binary.
|
||
xz mini_debuginfo
|
||
objcopy --add-section .gnu_debugdata=mini_debuginfo.xz BINARY
|
||
|
||
|
||
File: gdb.info, Node: Index Files, Next: Symbol Errors, Prev: MiniDebugInfo, Up: GDB Files
|
||
|
||
18.4 Index Files Speed Up GDB
|
||
=============================
|
||
|
||
When GDB finds a symbol file, it scans the symbols in the file in order
|
||
to construct an internal symbol table. This lets most GDB operations
|
||
work quickly--at the cost of a delay early on. For large programs, this
|
||
delay can be quite lengthy, so GDB provides a way to build an index,
|
||
which speeds up startup.
|
||
|
||
The index is stored as a section in the symbol file. GDB can write
|
||
the index to a file, then you can put it into the symbol file using
|
||
'objcopy'.
|
||
|
||
To create an index file, use the 'save gdb-index' command:
|
||
|
||
'save gdb-index DIRECTORY'
|
||
Create an index file for each symbol file currently known by GDB.
|
||
Each file is named after its corresponding symbol file, with
|
||
'.gdb-index' appended, and is written into the given DIRECTORY.
|
||
|
||
Once you have created an index file you can merge it into your symbol
|
||
file, here named 'symfile', using 'objcopy':
|
||
|
||
$ objcopy --add-section .gdb_index=symfile.gdb-index \
|
||
--set-section-flags .gdb_index=readonly symfile symfile
|
||
|
||
GDB will normally ignore older versions of '.gdb_index' sections that
|
||
have been deprecated. Usually they are deprecated because they are
|
||
missing a new feature or have performance issues. To tell GDB to use a
|
||
deprecated index section anyway specify 'set
|
||
use-deprecated-index-sections on'. The default is 'off'. This can
|
||
speed up startup, but may result in some functionality being lost.
|
||
*Note Index Section Format::.
|
||
|
||
_Warning:_ Setting 'use-deprecated-index-sections' to 'on' must be
|
||
done before gdb reads the file. The following will not work:
|
||
|
||
$ gdb -ex "set use-deprecated-index-sections on" <program>
|
||
|
||
Instead you must do, for example,
|
||
|
||
$ gdb -iex "set use-deprecated-index-sections on" <program>
|
||
|
||
There are currently some limitation on indices. They only work when
|
||
for DWARF debugging information, not stabs. And, they do not currently
|
||
work for programs using Ada.
|
||
|
||
|
||
File: gdb.info, Node: Symbol Errors, Next: Data Files, Prev: Index Files, Up: GDB Files
|
||
|
||
18.5 Errors Reading Symbol Files
|
||
================================
|
||
|
||
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 (*note
|
||
Optional Warnings and Messages: Messages/Warnings.).
|
||
|
||
The messages currently printed, and their meanings, include:
|
||
|
||
'inner block not inside outer block in SYMBOL'
|
||
|
||
The symbol information shows where symbol scopes begin and end
|
||
(such as at the start of a function or a block of statements).
|
||
This error indicates that an inner scope block is not fully
|
||
contained in its outer scope blocks.
|
||
|
||
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'
|
||
|
||
The symbol information for symbol scope blocks should occur in
|
||
order of increasing addresses. This error indicates that it does
|
||
not do so.
|
||
|
||
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'. *Note Optional Warnings and Messages:
|
||
Messages/Warnings.)
|
||
|
||
'bad block start address patched'
|
||
|
||
The symbol information for a symbol scope block has a start address
|
||
smaller than the address of the preceding source line. This is
|
||
known to occur in the SunOS 4.1.1 (and earlier) C compiler.
|
||
|
||
GDB circumvents the problem by treating the symbol scope block as
|
||
starting on the previous source line.
|
||
|
||
'bad string table offset in symbol N'
|
||
|
||
Symbol number N contains a pointer into the string table which is
|
||
larger than the size of the string table.
|
||
|
||
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'
|
||
|
||
The symbol information contains new data types that GDB does not
|
||
yet know how to read. '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'
|
||
|
||
GDB could not find the full definition for a struct or class.
|
||
|
||
'const/volatile indicator missing (ok if using g++ v1.x), got...'
|
||
The symbol information for a C++ member function is missing some
|
||
information that recent versions of the compiler should have output
|
||
for it.
|
||
|
||
'info mismatch between compiler and debugger'
|
||
|
||
GDB could not parse a type specification output by the compiler.
|
||
|
||
|
||
File: gdb.info, Node: Data Files, Prev: Symbol Errors, Up: GDB Files
|
||
|
||
18.6 GDB Data Files
|
||
===================
|
||
|
||
GDB will sometimes read an auxiliary data file. These files are kept in
|
||
a directory known as the "data directory".
|
||
|
||
You can set the data directory's name, and view the name GDB is
|
||
currently using.
|
||
|
||
'set data-directory DIRECTORY'
|
||
Set the directory which GDB searches for auxiliary data files to
|
||
DIRECTORY.
|
||
|
||
'show data-directory'
|
||
Show the directory GDB searches for auxiliary data files.
|
||
|
||
You can set the default data directory by using the configure-time
|
||
'--with-gdb-datadir' option. If the data directory is inside GDB's
|
||
configured binary prefix (set with '--prefix' or '--exec-prefix'), then
|
||
the default data directory will be updated automatically if the
|
||
installed GDB is moved to a new location.
|
||
|
||
The data directory may also be specified with the '--data-directory'
|
||
command line option. *Note Mode Options::.
|
||
|
||
|
||
File: gdb.info, Node: Targets, Next: Remote Debugging, Prev: GDB Files, Up: Top
|
||
|
||
19 Specifying a Debugging Target
|
||
********************************
|
||
|
||
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. 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 (*note Commands for Managing Targets:
|
||
Target Commands.).
|
||
|
||
It is possible to build GDB for several different "target
|
||
architectures". When GDB is built like that, you can choose one of the
|
||
available architectures with the 'set architecture' command.
|
||
|
||
'set architecture ARCH'
|
||
This command sets the current target architecture to ARCH. The
|
||
value of ARCH can be '"auto"', in addition to one of the supported
|
||
architectures.
|
||
|
||
'show architecture'
|
||
Show the current target architecture.
|
||
|
||
'set processor'
|
||
'processor'
|
||
These are alias commands for, respectively, 'set architecture' and
|
||
'show architecture'.
|
||
|
||
* Menu:
|
||
|
||
* Active Targets:: Active targets
|
||
* Target Commands:: Commands for managing targets
|
||
* Byte Order:: Choosing target byte order
|
||
|
||
|
||
File: gdb.info, Node: Active Targets, Next: Target Commands, Up: Targets
|
||
|
||
19.1 Active Targets
|
||
===================
|
||
|
||
There are multiple classes of targets such as: processes, executable
|
||
files or recording sessions. Core files belong to the process class,
|
||
making core file and process mutually exclusive. Otherwise, GDB can
|
||
work concurrently on multiple active targets, one in each class. This
|
||
allows you to (for example) start a process and inspect its activity,
|
||
while still having access to the executable file after the process
|
||
finishes. Or if you start process recording (*note Reverse Execution::)
|
||
and 'reverse-step' there, you are presented a virtual layer of the
|
||
recording target, while the process target remains stopped at the
|
||
chronologically last point of the process execution.
|
||
|
||
Use the 'core-file' and 'exec-file' commands to select a new core
|
||
file or executable target (*note Commands to Specify Files: Files.). To
|
||
specify as a target a process that is already running, use the 'attach'
|
||
command (*note Debugging an Already-running Process: Attach.).
|
||
|
||
|
||
File: gdb.info, Node: Target Commands, Next: Byte Order, Prev: Active Targets, Up: Targets
|
||
|
||
19.2 Commands for Managing Targets
|
||
==================================
|
||
|
||
'target TYPE PARAMETERS'
|
||
Connects the GDB host environment to a target machine or process.
|
||
A target is typically a protocol for talking to debugging
|
||
facilities. You use the argument TYPE to specify the type or
|
||
protocol of the target machine.
|
||
|
||
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'
|
||
Displays the names of all targets available. To display targets
|
||
currently selected, use either 'info target' or 'info files' (*note
|
||
Commands to Specify Files: Files.).
|
||
|
||
'help target NAME'
|
||
Describe a particular target, including any parameters necessary to
|
||
select it.
|
||
|
||
'set gnutarget ARGS'
|
||
GDB uses its own library BFD to read your files. GDB knows whether
|
||
it is reading an "executable", a "core", or a ".o" file; however,
|
||
you can specify the file format with the '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.
|
||
|
||
*Note Commands to Specify Files: Files.
|
||
|
||
'show gnutarget'
|
||
Use the '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 BFD target is "auto"'.
|
||
|
||
Here are some common targets (available, or not, depending on the GDB
|
||
configuration):
|
||
|
||
'target exec PROGRAM'
|
||
An executable file. 'target exec PROGRAM' is the same as
|
||
'exec-file PROGRAM'.
|
||
|
||
'target core FILENAME'
|
||
A core dump file. 'target core FILENAME' is the same as 'core-file
|
||
FILENAME'.
|
||
|
||
'target remote MEDIUM'
|
||
A remote system connected to GDB via a serial line or network
|
||
connection. This command tells GDB to use its own remote protocol
|
||
over MEDIUM for debugging. *Note Remote Debugging::.
|
||
|
||
For example, if you have a board connected to '/dev/ttya' on the
|
||
machine running GDB, you could say:
|
||
|
||
target remote /dev/ttya
|
||
|
||
'target remote' supports the '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 [SIMARGS] ...'
|
||
Builtin CPU simulator. GDB includes simulators for most
|
||
architectures. In general,
|
||
target sim
|
||
load
|
||
run
|
||
works; however, you cannot assume that a specific memory map,
|
||
device drivers, or even basic I/O is available, although some
|
||
simulators do provide these. For info about any processor-specific
|
||
simulator details, see the appropriate section in *note Embedded
|
||
Processors: Embedded Processors.
|
||
|
||
'target native'
|
||
Setup for local/native process debugging. Useful to make the 'run'
|
||
command spawn native processes (likewise 'attach', etc.) even when
|
||
'set auto-connect-native-target' is 'off' (*note set
|
||
auto-connect-native-target::).
|
||
|
||
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. You may wish to
|
||
control various aspects of this process.
|
||
|
||
'set hash'
|
||
This command controls whether a hash mark '#' is displayed while
|
||
downloading a file to the remote monitor. If on, a hash mark is
|
||
displayed after each S-record is successfully downloaded to the
|
||
monitor.
|
||
|
||
'show hash'
|
||
Show the current status of displaying the hash mark.
|
||
|
||
'set debug monitor'
|
||
Enable or disable display of communications messages between GDB
|
||
and the remote monitor.
|
||
|
||
'show debug monitor'
|
||
Show the current status of displaying communications between GDB
|
||
and the remote monitor.
|
||
|
||
'load FILENAME'
|
||
Depending on what remote debugging facilities are configured into
|
||
GDB, the '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.
|
||
|
||
Depending on the remote side capabilities, GDB may be able to load
|
||
programs into flash memory.
|
||
|
||
'load' does not repeat if you press <RET> again after using it.
|
||
|
||
|
||
File: gdb.info, Node: Byte Order, Prev: Target Commands, Up: Targets
|
||
|
||
19.3 Choosing Target Byte Order
|
||
===============================
|
||
|
||
Some types of processors, such as the MIPS, PowerPC, and Renesas 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'
|
||
Instruct GDB to assume the target is big-endian.
|
||
|
||
'set endian little'
|
||
Instruct GDB to assume the target is little-endian.
|
||
|
||
'set endian auto'
|
||
Instruct GDB to use the byte order associated with the executable.
|
||
|
||
'show endian'
|
||
Display GDB's current idea of the target byte order.
|
||
|
||
Note that these commands merely adjust interpretation of symbolic
|
||
data on the host, and that they have absolutely no effect on the target
|
||
system.
|
||
|
||
|
||
File: gdb.info, Node: Remote Debugging, Next: Configurations, Prev: Targets, Up: Top
|
||
|
||
20 Debugging Remote Programs
|
||
****************************
|
||
|
||
If you are trying to debug a program running on a machine that cannot
|
||
run GDB in the usual way, it is often useful to use remote debugging.
|
||
For example, you might use remote debugging on an operating system
|
||
kernel, or on a small system which does not have a general purpose
|
||
operating system powerful enough to run a full-featured debugger.
|
||
|
||
Some configurations of GDB have special serial or TCP/IP interfaces
|
||
to make this work with particular debugging targets. In addition, GDB
|
||
comes with a generic serial protocol (specific to GDB, but not specific
|
||
to any particular target system) which you can use if you write the
|
||
remote stubs--the code that runs on the remote system to communicate
|
||
with GDB.
|
||
|
||
Other remote targets may be available in your configuration of GDB;
|
||
use 'help target' to list them.
|
||
|
||
* Menu:
|
||
|
||
* Connecting:: Connecting to a remote target
|
||
* File Transfer:: Sending files to a remote system
|
||
* Server:: Using the gdbserver program
|
||
* Remote Configuration:: Remote configuration
|
||
* Remote Stub:: Implementing a remote stub
|
||
|
||
|
||
File: gdb.info, Node: Connecting, Next: File Transfer, Up: Remote Debugging
|
||
|
||
20.1 Connecting to a Remote Target
|
||
==================================
|
||
|
||
On the GDB host machine, you will need an unstripped copy of your
|
||
program, since GDB needs symbol and debugging information. Start up GDB
|
||
as usual, using the name of the local copy of your program as the first
|
||
argument.
|
||
|
||
GDB can communicate with the target over a serial line, or over an IP
|
||
network using TCP or UDP. In each case, GDB uses the same protocol for
|
||
debugging your program; only the medium carrying the debugging packets
|
||
varies. The 'target remote' command establishes a connection to the
|
||
target. Its arguments indicate which medium to use:
|
||
|
||
'target remote SERIAL-DEVICE'
|
||
Use SERIAL-DEVICE to communicate with the target. For example, to
|
||
use a serial line connected to the device named '/dev/ttyb':
|
||
|
||
target remote /dev/ttyb
|
||
|
||
If you're using a serial line, you may want to give GDB the
|
||
'--baud' option, or use the 'set serial baud' command (*note set
|
||
serial baud: Remote Configuration.) before the 'target' command.
|
||
|
||
'target remote HOST:PORT'
|
||
'target remote tcp:HOST:PORT'
|
||
Debug using a TCP connection to PORT on HOST. The HOST may be
|
||
either a host name or a numeric IP address; PORT must be a decimal
|
||
number. The HOST could be the target machine itself, if it is
|
||
directly connected to the net, or it might be a terminal server
|
||
which in turn has a serial line to the target.
|
||
|
||
For example, to connect to port 2828 on a terminal server named
|
||
'manyfarms':
|
||
|
||
target remote manyfarms:2828
|
||
|
||
If your remote target is actually running on the same machine as
|
||
your debugger session (e.g. a simulator for your target running on
|
||
the same host), you can omit the hostname. For example, to connect
|
||
to port 1234 on your local machine:
|
||
|
||
target remote :1234
|
||
|
||
Note that the colon is still required here.
|
||
|
||
'target remote udp:HOST:PORT'
|
||
Debug using UDP packets to PORT on HOST. For example, to connect
|
||
to UDP port 2828 on a terminal server named 'manyfarms':
|
||
|
||
target remote udp:manyfarms:2828
|
||
|
||
When using a UDP connection for remote debugging, you should keep
|
||
in mind that the 'U' stands for "Unreliable". UDP can silently
|
||
drop packets on busy or unreliable networks, which will cause havoc
|
||
with your debugging session.
|
||
|
||
'target remote | COMMAND'
|
||
Run COMMAND in the background and communicate with it using a pipe.
|
||
The COMMAND is a shell command, to be parsed and expanded by the
|
||
system's command shell, '/bin/sh'; it should expect remote protocol
|
||
packets on its standard input, and send replies on its standard
|
||
output. You could use this to run a stand-alone simulator that
|
||
speaks the remote debugging protocol, to make net connections using
|
||
programs like 'ssh', or for other similar tricks.
|
||
|
||
If COMMAND closes its standard output (perhaps by exiting), GDB
|
||
will try to send it a 'SIGTERM' signal. (If the program has
|
||
already exited, this will have no effect.)
|
||
|
||
Once the connection has been established, you can use all the usual
|
||
commands to examine and change data. The remote program is already
|
||
running; you can use 'step' and 'continue', and you do not need to use
|
||
'run'.
|
||
|
||
Whenever GDB is waiting for the remote program, if you type the
|
||
interrupt character (often 'Ctrl-c'), GDB attempts to stop the program.
|
||
This may or may not succeed, depending in part on the hardware and the
|
||
serial drivers the remote system uses. If you type the interrupt
|
||
character once again, GDB displays this prompt:
|
||
|
||
Interrupted while waiting for the program.
|
||
Give up (and stop debugging it)? (y or n)
|
||
|
||
If you type 'y', GDB abandons the remote debugging session. (If you
|
||
decide you want to try again later, you can use 'target remote' again to
|
||
connect once more.) If you type 'n', GDB goes back to waiting.
|
||
|
||
'detach'
|
||
When you have finished debugging the remote program, you can use
|
||
the 'detach' command to release it from GDB control. Detaching
|
||
from the target normally resumes its execution, but the results
|
||
will depend on your particular remote stub. After the 'detach'
|
||
command, GDB is free to connect to another target.
|
||
|
||
'disconnect'
|
||
The 'disconnect' command behaves like 'detach', except that the
|
||
target is generally not resumed. It will wait for GDB (this
|
||
instance or another one) to connect and continue debugging. After
|
||
the 'disconnect' command, GDB is again free to connect to another
|
||
target.
|
||
|
||
'monitor CMD'
|
||
This command allows you to send arbitrary commands directly to the
|
||
remote monitor. Since GDB doesn't care about the commands it sends
|
||
like this, this command is the way to extend GDB--you can add new
|
||
commands that only the external monitor will understand and
|
||
implement.
|
||
|
||
|
||
File: gdb.info, Node: File Transfer, Next: Server, Prev: Connecting, Up: Remote Debugging
|
||
|
||
20.2 Sending files to a remote system
|
||
=====================================
|
||
|
||
Some remote targets offer the ability to transfer files over the same
|
||
connection used to communicate with GDB. This is convenient for targets
|
||
accessible through other means, e.g. GNU/Linux systems running
|
||
'gdbserver' over a network interface. For other targets, e.g. embedded
|
||
devices with only a single serial port, this may be the only way to
|
||
upload or download files.
|
||
|
||
Not all remote targets support these commands.
|
||
|
||
'remote put HOSTFILE TARGETFILE'
|
||
Copy file HOSTFILE from the host system (the machine running GDB)
|
||
to TARGETFILE on the target system.
|
||
|
||
'remote get TARGETFILE HOSTFILE'
|
||
Copy file TARGETFILE from the target system to HOSTFILE on the host
|
||
system.
|
||
|
||
'remote delete TARGETFILE'
|
||
Delete TARGETFILE from the target system.
|
||
|
||
|
||
File: gdb.info, Node: Server, Next: Remote Configuration, Prev: File Transfer, Up: Remote Debugging
|
||
|
||
20.3 Using the 'gdbserver' Program
|
||
==================================
|
||
|
||
'gdbserver' is a control program for Unix-like systems, which allows you
|
||
to connect your program with a remote GDB via 'target remote'--but
|
||
without linking in the usual debugging stub.
|
||
|
||
'gdbserver' is not a complete replacement for the debugging stubs,
|
||
because it requires essentially the same operating-system facilities
|
||
that GDB itself does. In fact, a system that can run 'gdbserver' to
|
||
connect to a remote GDB could also run GDB locally! 'gdbserver' is
|
||
sometimes useful nevertheless, because it is a much smaller program than
|
||
GDB itself. It is also easier to port than all of GDB, so you may be
|
||
able to get started more quickly on a new system by using 'gdbserver'.
|
||
Finally, if you develop code for real-time systems, you may find that
|
||
the tradeoffs involved in real-time operation make it more convenient to
|
||
do as much development work as possible on another system, for example
|
||
by cross-compiling. You can use 'gdbserver' to make a similar choice
|
||
for debugging.
|
||
|
||
GDB and 'gdbserver' communicate via either a serial line or a TCP
|
||
connection, using the standard GDB remote serial protocol.
|
||
|
||
_Warning:_ 'gdbserver' does not have any built-in security. Do not
|
||
run 'gdbserver' connected to any public network; a GDB connection
|
||
to 'gdbserver' provides access to the target system with the same
|
||
privileges as the user running 'gdbserver'.
|
||
|
||
20.3.1 Running 'gdbserver'
|
||
--------------------------
|
||
|
||
Run 'gdbserver' on the target system. You need a copy of the program
|
||
you want to debug, including any libraries it requires. 'gdbserver'
|
||
does not need your program's symbol table, so you can strip the program
|
||
if necessary to save space. GDB on the host system does all the symbol
|
||
handling.
|
||
|
||
To use the server, you must tell it how to communicate with GDB; the
|
||
name of your program; and the arguments for your program. The usual
|
||
syntax is:
|
||
|
||
target> gdbserver COMM PROGRAM [ ARGS ... ]
|
||
|
||
COMM is either a device name (to use a serial line), or a TCP
|
||
hostname and portnumber, or '-' or 'stdio' to use stdin/stdout of
|
||
'gdbserver'. For example, to debug Emacs with the argument 'foo.txt'
|
||
and communicate with GDB over the serial port '/dev/com1':
|
||
|
||
target> gdbserver /dev/com1 emacs foo.txt
|
||
|
||
'gdbserver' waits passively for the host GDB to communicate with it.
|
||
|
||
To use a TCP connection instead of a serial line:
|
||
|
||
target> gdbserver host:2345 emacs foo.txt
|
||
|
||
The only difference from the previous example is the first argument,
|
||
specifying that you are communicating with the host GDB via TCP. The
|
||
'host:2345' argument means that 'gdbserver' is to expect a TCP
|
||
connection from machine 'host' to local TCP port 2345. (Currently, the
|
||
'host' part is ignored.) You can choose any number you want for the
|
||
port number as long as it does not conflict with any TCP ports already
|
||
in use on the target system (for example, '23' is reserved for
|
||
'telnet').(1) You must use the same port number with the host GDB
|
||
'target remote' command.
|
||
|
||
The 'stdio' connection is useful when starting 'gdbserver' with ssh:
|
||
|
||
(gdb) target remote | ssh -T hostname gdbserver - hello
|
||
|
||
The '-T' option to ssh is provided because we don't need a remote
|
||
pty, and we don't want escape-character handling. Ssh does this by
|
||
default when a command is provided, the flag is provided to make it
|
||
explicit. You could elide it if you want to.
|
||
|
||
Programs started with stdio-connected gdbserver have '/dev/null' for
|
||
'stdin', and 'stdout','stderr' are sent back to gdb for display through
|
||
a pipe connected to gdbserver. Both 'stdout' and 'stderr' use the same
|
||
pipe.
|
||
|
||
20.3.1.1 Attaching to a Running Program
|
||
.......................................
|
||
|
||
On some targets, 'gdbserver' can also attach to running programs. This
|
||
is accomplished via the '--attach' argument. The syntax is:
|
||
|
||
target> gdbserver --attach COMM PID
|
||
|
||
PID is the process ID of a currently running process. It isn't
|
||
necessary to point 'gdbserver' at a binary for the running process.
|
||
|
||
You can debug processes by name instead of process ID if your target
|
||
has the 'pidof' utility:
|
||
|
||
target> gdbserver --attach COMM `pidof PROGRAM`
|
||
|
||
In case more than one copy of PROGRAM is running, or PROGRAM has
|
||
multiple threads, most versions of 'pidof' support the '-s' option to
|
||
only return the first process ID.
|
||
|
||
20.3.1.2 Multi-Process Mode for 'gdbserver'
|
||
...........................................
|
||
|
||
When you connect to 'gdbserver' using 'target remote', 'gdbserver'
|
||
debugs the specified program only once. When the program exits, or you
|
||
detach from it, GDB closes the connection and 'gdbserver' exits.
|
||
|
||
If you connect using 'target extended-remote', 'gdbserver' enters
|
||
multi-process mode. When the debugged program exits, or you detach from
|
||
it, GDB stays connected to 'gdbserver' even though no program is
|
||
running. The 'run' and 'attach' commands instruct 'gdbserver' to run or
|
||
attach to a new program. The 'run' command uses 'set remote exec-file'
|
||
(*note set remote exec-file::) to select the program to run. Command
|
||
line arguments are supported, except for wildcard expansion and I/O
|
||
redirection (*note Arguments::).
|
||
|
||
To start 'gdbserver' without supplying an initial command to run or
|
||
process ID to attach, use the '--multi' command line option. Then you
|
||
can connect using 'target extended-remote' and start the program you
|
||
want to debug.
|
||
|
||
In multi-process mode 'gdbserver' does not automatically exit unless
|
||
you use the option '--once'. You can terminate it by using 'monitor
|
||
exit' (*note Monitor Commands for gdbserver::). Note that the
|
||
conditions under which 'gdbserver' terminates depend on how GDB connects
|
||
to it ('target remote' or 'target extended-remote'). The '--multi'
|
||
option to 'gdbserver' has no influence on that.
|
||
|
||
20.3.1.3 TCP port allocation lifecycle of 'gdbserver'
|
||
.....................................................
|
||
|
||
This section applies only when 'gdbserver' is run to listen on a TCP
|
||
port.
|
||
|
||
'gdbserver' normally terminates after all of its debugged processes
|
||
have terminated in 'target remote' mode. On the other hand, for 'target
|
||
extended-remote', 'gdbserver' stays running even with no processes left.
|
||
GDB normally terminates the spawned debugged process on its exit, which
|
||
normally also terminates 'gdbserver' in the 'target remote' mode.
|
||
Therefore, when the connection drops unexpectedly, and GDB cannot ask
|
||
'gdbserver' to kill its debugged processes, 'gdbserver' stays running
|
||
even in the 'target remote' mode.
|
||
|
||
When 'gdbserver' stays running, GDB can connect to it again later.
|
||
Such reconnecting is useful for features like *note disconnected
|
||
tracing::. For completeness, at most one GDB can be connected at a
|
||
time.
|
||
|
||
By default, 'gdbserver' keeps the listening TCP port open, so that
|
||
subsequent connections are possible. However, if you start 'gdbserver'
|
||
with the '--once' option, it will stop listening for any further
|
||
connection attempts after connecting to the first GDB session. This
|
||
means no further connections to 'gdbserver' will be possible after the
|
||
first one. It also means 'gdbserver' will terminate after the first
|
||
connection with remote GDB has closed, even for unexpectedly closed
|
||
connections and even in the 'target extended-remote' mode. The '--once'
|
||
option allows reusing the same port number for connecting to multiple
|
||
instances of 'gdbserver' running on the same host, since each instance
|
||
closes its port after the first connection.
|
||
|
||
20.3.1.4 Other Command-Line Arguments for 'gdbserver'
|
||
.....................................................
|
||
|
||
The '--debug' option tells 'gdbserver' to display extra status
|
||
information about the debugging process. The '--remote-debug' option
|
||
tells 'gdbserver' to display remote protocol debug output. These
|
||
options are intended for 'gdbserver' development and for bug reports to
|
||
the developers.
|
||
|
||
The '--debug-format=option1[,option2,...]' option tells 'gdbserver'
|
||
to include additional information in each output. Possible options are:
|
||
|
||
'none'
|
||
Turn off all extra information in debugging output.
|
||
'all'
|
||
Turn on all extra information in debugging output.
|
||
'timestamps'
|
||
Include a timestamp in each line of debugging output.
|
||
|
||
Options are processed in order. Thus, for example, if 'none' appears
|
||
last then no additional information is added to debugging output.
|
||
|
||
The '--wrapper' option specifies a wrapper to launch programs for
|
||
debugging. The option should be followed by the name of the wrapper,
|
||
then any command-line arguments to pass to the wrapper, then '--'
|
||
indicating the end of the wrapper arguments.
|
||
|
||
'gdbserver' runs the specified wrapper program with a combined
|
||
command line including the wrapper arguments, then the name of the
|
||
program to debug, then any arguments to the program. The wrapper runs
|
||
until it executes your program, and then GDB gains control.
|
||
|
||
You can use any program that eventually calls 'execve' with its
|
||
arguments as a wrapper. Several standard Unix utilities do this, e.g.
|
||
'env' and 'nohup'. Any Unix shell script ending with 'exec "$@"' will
|
||
also work.
|
||
|
||
For example, you can use 'env' to pass an environment variable to the
|
||
debugged program, without setting the variable in 'gdbserver''s
|
||
environment:
|
||
|
||
$ gdbserver --wrapper env LD_PRELOAD=libtest.so -- :2222 ./testprog
|
||
|
||
20.3.2 Connecting to 'gdbserver'
|
||
--------------------------------
|
||
|
||
Run GDB on the host system.
|
||
|
||
First make sure you have the necessary symbol files. Load symbols
|
||
for your application using the 'file' command before you connect. Use
|
||
'set sysroot' to locate target libraries (unless your GDB was compiled
|
||
with the correct sysroot using '--with-sysroot').
|
||
|
||
The symbol file and target libraries must exactly match the
|
||
executable and libraries on the target, with one exception: the files on
|
||
the host system should not be stripped, even if the files on the target
|
||
system are. Mismatched or missing files will lead to confusing results
|
||
during debugging. On GNU/Linux targets, mismatched or missing files may
|
||
also prevent 'gdbserver' from debugging multi-threaded programs.
|
||
|
||
Connect to your target (*note Connecting to a Remote Target:
|
||
Connecting.). For TCP connections, you must start up 'gdbserver' prior
|
||
to using the 'target remote' command. Otherwise you may get an error
|
||
whose text depends on the host system, but which usually looks something
|
||
like 'Connection refused'. Don't use the 'load' command in GDB when
|
||
using 'gdbserver', since the program is already on the target.
|
||
|
||
20.3.3 Monitor Commands for 'gdbserver'
|
||
---------------------------------------
|
||
|
||
During a GDB session using 'gdbserver', you can use the 'monitor'
|
||
command to send special requests to 'gdbserver'. Here are the available
|
||
commands.
|
||
|
||
'monitor help'
|
||
List the available monitor commands.
|
||
|
||
'monitor set debug 0'
|
||
'monitor set debug 1'
|
||
Disable or enable general debugging messages.
|
||
|
||
'monitor set remote-debug 0'
|
||
'monitor set remote-debug 1'
|
||
Disable or enable specific debugging messages associated with the
|
||
remote protocol (*note Remote Protocol::).
|
||
|
||
'monitor set debug-format option1[,option2,...]'
|
||
Specify additional text to add to debugging messages. Possible
|
||
options are:
|
||
|
||
'none'
|
||
Turn off all extra information in debugging output.
|
||
'all'
|
||
Turn on all extra information in debugging output.
|
||
'timestamps'
|
||
Include a timestamp in each line of debugging output.
|
||
|
||
Options are processed in order. Thus, for example, if 'none'
|
||
appears last then no additional information is added to debugging
|
||
output.
|
||
|
||
'monitor set libthread-db-search-path [PATH]'
|
||
When this command is issued, PATH is a colon-separated list of
|
||
directories to search for 'libthread_db' (*note set
|
||
libthread-db-search-path: Threads.). If you omit PATH,
|
||
'libthread-db-search-path' will be reset to its default value.
|
||
|
||
The special entry '$pdir' for 'libthread-db-search-path' is not
|
||
supported in 'gdbserver'.
|
||
|
||
'monitor exit'
|
||
Tell gdbserver to exit immediately. This command should be
|
||
followed by 'disconnect' to close the debugging session.
|
||
'gdbserver' will detach from any attached processes and kill any
|
||
processes it created. Use 'monitor exit' to terminate 'gdbserver'
|
||
at the end of a multi-process mode debug session.
|
||
|
||
20.3.4 Tracepoints support in 'gdbserver'
|
||
-----------------------------------------
|
||
|
||
On some targets, 'gdbserver' supports tracepoints, fast tracepoints and
|
||
static tracepoints.
|
||
|
||
For fast or static tracepoints to work, a special library called the
|
||
"in-process agent" (IPA), must be loaded in the inferior process. This
|
||
library is built and distributed as an integral part of 'gdbserver'. In
|
||
addition, support for static tracepoints requires building the
|
||
in-process agent library with static tracepoints support. At present,
|
||
the UST (LTTng Userspace Tracer, <http://lttng.org/ust>) tracing engine
|
||
is supported. This support is automatically available if UST
|
||
development headers are found in the standard include path when
|
||
'gdbserver' is built, or if 'gdbserver' was explicitly configured using
|
||
'--with-ust' to point at such headers. You can explicitly disable the
|
||
support using '--with-ust=no'.
|
||
|
||
There are several ways to load the in-process agent in your program:
|
||
|
||
'Specifying it as dependency at link time'
|
||
|
||
You can link your program dynamically with the in-process agent
|
||
library. On most systems, this is accomplished by adding
|
||
'-linproctrace' to the link command.
|
||
|
||
'Using the system's preloading mechanisms'
|
||
|
||
You can force loading the in-process agent at startup time by using
|
||
your system's support for preloading shared libraries. Many Unixes
|
||
support the concept of preloading user defined libraries. In most
|
||
cases, you do that by specifying 'LD_PRELOAD=libinproctrace.so' in
|
||
the environment. See also the description of 'gdbserver''s
|
||
'--wrapper' command line option.
|
||
|
||
'Using GDB to force loading the agent at run time'
|
||
|
||
On some systems, you can force the inferior to load a shared
|
||
library, by calling a dynamic loader function in the inferior that
|
||
takes care of dynamically looking up and loading a shared library.
|
||
On most Unix systems, the function is 'dlopen'. You'll use the
|
||
'call' command for that. For example:
|
||
|
||
(gdb) call dlopen ("libinproctrace.so", ...)
|
||
|
||
Note that on most Unix systems, for the 'dlopen' function to be
|
||
available, the program needs to be linked with '-ldl'.
|
||
|
||
On systems that have a userspace dynamic loader, like most Unix
|
||
systems, when you connect to 'gdbserver' using 'target remote', you'll
|
||
find that the program is stopped at the dynamic loader's entry point,
|
||
and no shared library has been loaded in the program's address space
|
||
yet, including the in-process agent. In that case, before being able to
|
||
use any of the fast or static tracepoints features, you need to let the
|
||
loader run and load the shared libraries. The simplest way to do that
|
||
is to run the program to the main procedure. E.g., if debugging a C or
|
||
C++ program, start 'gdbserver' like so:
|
||
|
||
$ gdbserver :9999 myprogram
|
||
|
||
Start GDB and connect to 'gdbserver' like so, and run to main:
|
||
|
||
$ gdb myprogram
|
||
(gdb) target remote myhost:9999
|
||
0x00007f215893ba60 in ?? () from /lib64/ld-linux-x86-64.so.2
|
||
(gdb) b main
|
||
(gdb) continue
|
||
|
||
The in-process tracing agent library should now be loaded into the
|
||
process; you can confirm it with the 'info sharedlibrary' command, which
|
||
will list 'libinproctrace.so' as loaded in the process. You are now
|
||
ready to install fast tracepoints, list static tracepoint markers, probe
|
||
static tracepoints markers, and start tracing.
|
||
|
||
---------- Footnotes ----------
|
||
|
||
(1) If you choose a port number that conflicts with another service,
|
||
'gdbserver' prints an error message and exits.
|
||
|
||
|
||
File: gdb.info, Node: Remote Configuration, Next: Remote Stub, Prev: Server, Up: Remote Debugging
|
||
|
||
20.4 Remote Configuration
|
||
=========================
|
||
|
||
This section documents the configuration options available when
|
||
debugging remote programs. For the options related to the File I/O
|
||
extensions of the remote protocol, see *note system-call-allowed:
|
||
system.
|
||
|
||
'set remoteaddresssize BITS'
|
||
Set the maximum size of address in a memory packet to the specified
|
||
number of bits. GDB will mask off the address bits above that
|
||
number, when it passes addresses to the remote target. The default
|
||
value is the number of bits in the target's address.
|
||
|
||
'show remoteaddresssize'
|
||
Show the current value of remote address size in bits.
|
||
|
||
'set serial baud N'
|
||
Set the baud rate for the remote serial I/O to N baud. The value
|
||
is used to set the speed of the serial port used for debugging
|
||
remote targets.
|
||
|
||
'show serial baud'
|
||
Show the current speed of the remote connection.
|
||
|
||
'set remotebreak'
|
||
If set to on, GDB sends a 'BREAK' signal to the remote when you
|
||
type 'Ctrl-c' to interrupt the program running on the remote. If
|
||
set to off, GDB sends the 'Ctrl-C' character instead. The default
|
||
is off, since most remote systems expect to see 'Ctrl-C' as the
|
||
interrupt signal.
|
||
|
||
'show remotebreak'
|
||
Show whether GDB sends 'BREAK' or 'Ctrl-C' to interrupt the remote
|
||
program.
|
||
|
||
'set remoteflow on'
|
||
'set remoteflow off'
|
||
Enable or disable hardware flow control ('RTS'/'CTS') on the serial
|
||
port used to communicate to the remote target.
|
||
|
||
'show remoteflow'
|
||
Show the current setting of hardware flow control.
|
||
|
||
'set remotelogbase BASE'
|
||
Set the base (a.k.a. radix) of logging serial protocol
|
||
communications to BASE. Supported values of BASE are: 'ascii',
|
||
'octal', and 'hex'. The default is 'ascii'.
|
||
|
||
'show remotelogbase'
|
||
Show the current setting of the radix for logging remote serial
|
||
protocol.
|
||
|
||
'set remotelogfile FILE'
|
||
Record remote serial communications on the named FILE. The default
|
||
is not to record at all.
|
||
|
||
'show remotelogfile.'
|
||
Show the current setting of the file name on which to record the
|
||
serial communications.
|
||
|
||
'set remotetimeout NUM'
|
||
Set the timeout limit to wait for the remote target to respond to
|
||
NUM seconds. The default is 2 seconds.
|
||
|
||
'show remotetimeout'
|
||
Show the current number of seconds to wait for the remote target
|
||
responses.
|
||
|
||
'set remote hardware-watchpoint-limit LIMIT'
|
||
'set remote hardware-breakpoint-limit LIMIT'
|
||
Restrict GDB to using LIMIT remote hardware breakpoint or
|
||
watchpoints. A limit of -1, the default, is treated as unlimited.
|
||
|
||
'set remote hardware-watchpoint-length-limit LIMIT'
|
||
Restrict GDB to using LIMIT bytes for the maximum length of a
|
||
remote hardware watchpoint. A limit of -1, the default, is treated
|
||
as unlimited.
|
||
|
||
'show remote hardware-watchpoint-length-limit'
|
||
Show the current limit (in bytes) of the maximum length of a remote
|
||
hardware watchpoint.
|
||
|
||
'set remote exec-file FILENAME'
|
||
'show remote exec-file'
|
||
Select the file used for 'run' with 'target extended-remote'. This
|
||
should be set to a filename valid on the target system. If it is
|
||
not set, the target will use a default filename (e.g. the last
|
||
program run).
|
||
|
||
'set remote interrupt-sequence'
|
||
Allow the user to select one of 'Ctrl-C', a 'BREAK' or 'BREAK-g' as
|
||
the sequence to the remote target in order to interrupt the
|
||
execution. 'Ctrl-C' is a default. Some system prefers 'BREAK'
|
||
which is high level of serial line for some certain time. Linux
|
||
kernel prefers 'BREAK-g', a.k.a Magic SysRq g. It is 'BREAK'
|
||
signal followed by character 'g'.
|
||
|
||
'show interrupt-sequence'
|
||
Show which of 'Ctrl-C', 'BREAK' or 'BREAK-g' is sent by GDB to
|
||
interrupt the remote program. 'BREAK-g' is BREAK signal followed
|
||
by 'g' and also known as Magic SysRq g.
|
||
|
||
'set remote interrupt-on-connect'
|
||
Specify whether interrupt-sequence is sent to remote target when
|
||
GDB connects to it. This is mostly needed when you debug Linux
|
||
kernel. Linux kernel expects 'BREAK' followed by 'g' which is
|
||
known as Magic SysRq g in order to connect GDB.
|
||
|
||
'show interrupt-on-connect'
|
||
Show whether interrupt-sequence is sent to remote target when GDB
|
||
connects to it.
|
||
|
||
'set tcp auto-retry on'
|
||
Enable auto-retry for remote TCP connections. This is useful if
|
||
the remote debugging agent is launched in parallel with GDB; there
|
||
is a race condition because the agent may not become ready to
|
||
accept the connection before GDB attempts to connect. When
|
||
auto-retry is enabled, if the initial attempt to connect fails, GDB
|
||
reattempts to establish the connection using the timeout specified
|
||
by 'set tcp connect-timeout'.
|
||
|
||
'set tcp auto-retry off'
|
||
Do not auto-retry failed TCP connections.
|
||
|
||
'show tcp auto-retry'
|
||
Show the current auto-retry setting.
|
||
|
||
'set tcp connect-timeout SECONDS'
|
||
'set tcp connect-timeout unlimited'
|
||
Set the timeout for establishing a TCP connection to the remote
|
||
target to SECONDS. The timeout affects both polling to retry
|
||
failed connections (enabled by 'set tcp auto-retry on') and waiting
|
||
for connections that are merely slow to complete, and represents an
|
||
approximate cumulative value. If SECONDS is 'unlimited', there is
|
||
no timeout and GDB will keep attempting to establish a connection
|
||
forever, unless interrupted with 'Ctrl-c'. The default is 15
|
||
seconds.
|
||
|
||
'show tcp connect-timeout'
|
||
Show the current connection timeout setting.
|
||
|
||
The GDB remote protocol autodetects the packets supported by your
|
||
debugging stub. If you need to override the autodetection, you can use
|
||
these commands to enable or disable individual packets. Each packet can
|
||
be set to 'on' (the remote target supports this packet), 'off' (the
|
||
remote target does not support this packet), or 'auto' (detect remote
|
||
target support for this packet). They all default to 'auto'. For more
|
||
information about each packet, see *note Remote Protocol::.
|
||
|
||
During normal use, you should not have to use any of these commands.
|
||
If you do, that may be a bug in your remote debugging stub, or a bug in
|
||
GDB. You may want to report the problem to the GDB developers.
|
||
|
||
For each packet NAME, the command to enable or disable the packet is
|
||
'set remote NAME-packet'. The available settings are:
|
||
|
||
Command Name Remote Packet Related Features
|
||
|
||
'fetch-register' 'p' 'info registers'
|
||
|
||
'set-register' 'P' 'set'
|
||
|
||
'binary-download' 'X' 'load', 'set'
|
||
|
||
'read-aux-vector' 'qXfer:auxv:read' 'info auxv'
|
||
|
||
'symbol-lookup' 'qSymbol' Detecting
|
||
multiple threads
|
||
|
||
'attach' 'vAttach' 'attach'
|
||
|
||
'verbose-resume' 'vCont' Stepping or
|
||
resuming
|
||
multiple threads
|
||
|
||
'run' 'vRun' 'run'
|
||
|
||
'software-breakpoint''Z0' 'break'
|
||
|
||
'hardware-breakpoint''Z1' 'hbreak'
|
||
|
||
'write-watchpoint' 'Z2' 'watch'
|
||
|
||
'read-watchpoint' 'Z3' 'rwatch'
|
||
|
||
'access-watchpoint' 'Z4' 'awatch'
|
||
|
||
'target-features' 'qXfer:features:read' 'set
|
||
architecture'
|
||
|
||
'library-info' 'qXfer:libraries:read' 'info
|
||
sharedlibrary'
|
||
|
||
'memory-map' 'qXfer:memory-map:read' 'info mem'
|
||
|
||
'read-sdata-object' 'qXfer:sdata:read' 'print $_sdata'
|
||
|
||
'read-spu-object' 'qXfer:spu:read' 'info spu'
|
||
|
||
'write-spu-object' 'qXfer:spu:write' 'info spu'
|
||
|
||
'read-siginfo-object''qXfer:siginfo:read' 'print
|
||
$_siginfo'
|
||
|
||
'write-siginfo-object''qXfer:siginfo:write' 'set $_siginfo'
|
||
|
||
'threads' 'qXfer:threads:read' 'info threads'
|
||
|
||
'get-thread-local- 'qGetTLSAddr' Displaying
|
||
storage-address' '__thread'
|
||
variables
|
||
|
||
'get-thread-information-block-address''qGetTIBAddr'Display
|
||
MS-Windows
|
||
Thread
|
||
Information
|
||
Block.
|
||
|
||
'search-memory' 'qSearch:memory' 'find'
|
||
|
||
'supported-packets' 'qSupported' Remote
|
||
communications
|
||
parameters
|
||
|
||
'pass-signals' 'QPassSignals' 'handle SIGNAL'
|
||
|
||
'program-signals' 'QProgramSignals' 'handle SIGNAL'
|
||
|
||
'hostio-close-packet''vFile:close' 'remote get',
|
||
'remote put'
|
||
|
||
'hostio-open-packet' 'vFile:open' 'remote get',
|
||
'remote put'
|
||
|
||
'hostio-pread-packet''vFile:pread' 'remote get',
|
||
'remote put'
|
||
|
||
'hostio-pwrite-packet''vFile:pwrite' 'remote get',
|
||
'remote put'
|
||
|
||
'hostio-unlink-packet''vFile:unlink' 'remote delete'
|
||
|
||
'hostio-readlink-packet''vFile:readlink' Host I/O
|
||
|
||
'noack-packet' 'QStartNoAckMode' Packet
|
||
acknowledgment
|
||
|
||
'osdata' 'qXfer:osdata:read' 'info os'
|
||
|
||
'query-attached' 'qAttached' Querying remote
|
||
process attach
|
||
state.
|
||
|
||
'trace-buffer-size' 'QTBuffer:size' 'set
|
||
trace-buffer-size'
|
||
|
||
'trace-status' 'qTStatus' 'tstatus'
|
||
|
||
'traceframe-info' 'qXfer:traceframe-info:read'Traceframe info
|
||
|
||
'install-in-trace' 'InstallInTrace' Install
|
||
tracepoint in
|
||
tracing
|
||
|
||
'disable-randomization''QDisableRandomization''set
|
||
disable-randomization'
|
||
|
||
'conditional-breakpoints-packet''Z0 and Z1' 'Support for
|
||
target-side
|
||
breakpoint
|
||
condition
|
||
evaluation'
|
||
|
||
|
||
File: gdb.info, Node: Remote Stub, Prev: Remote Configuration, Up: Remote Debugging
|
||
|
||
20.5 Implementing a Remote Stub
|
||
===============================
|
||
|
||
The stub files provided with GDB implement the target side of the
|
||
communication protocol, and the GDB side is implemented in the GDB
|
||
source file 'remote.c'. Normally, you can simply allow these
|
||
subroutines to communicate, and ignore the details. (If you're
|
||
implementing your own stub file, you can still ignore the details: start
|
||
with one of the existing stub files. 'sparc-stub.c' is the best
|
||
organized, and therefore the easiest to read.)
|
||
|
||
To debug a program running on another machine (the debugging "target"
|
||
machine), you must first arrange for all the usual prerequisites for the
|
||
program to run by itself. For example, for a C program, you need:
|
||
|
||
1. A startup routine to set up the C runtime environment; these
|
||
usually have a name like 'crt0'. The startup routine may be
|
||
supplied by your hardware supplier, or you may have to write your
|
||
own.
|
||
|
||
2. A C subroutine library to support your program's subroutine calls,
|
||
notably managing input and output.
|
||
|
||
3. A way of getting your program to the other machine--for example, a
|
||
download program. These are often supplied by the hardware
|
||
manufacturer, but you may have to write your own from hardware
|
||
documentation.
|
||
|
||
The next step is to arrange for your program to use a serial port to
|
||
communicate with the machine where GDB is running (the "host" machine).
|
||
In general terms, the scheme looks like this:
|
||
|
||
_On the host,_
|
||
GDB already understands how to use this protocol; when everything
|
||
else is set up, you can simply use the 'target remote' command
|
||
(*note Specifying a Debugging Target: Targets.).
|
||
|
||
_On the target,_
|
||
you must link with your program a few special-purpose subroutines
|
||
that implement the GDB remote serial protocol. The file containing
|
||
these subroutines is called a "debugging stub".
|
||
|
||
On certain remote targets, you can use an auxiliary program
|
||
'gdbserver' instead of linking a stub into your program. *Note
|
||
Using the 'gdbserver' Program: Server, for details.
|
||
|
||
The debugging stub is specific to the architecture of the remote
|
||
machine; for example, use 'sparc-stub.c' to debug programs on SPARC
|
||
boards.
|
||
|
||
These working remote stubs are distributed with GDB:
|
||
|
||
'i386-stub.c'
|
||
For Intel 386 and compatible architectures.
|
||
|
||
'm68k-stub.c'
|
||
For Motorola 680x0 architectures.
|
||
|
||
'sh-stub.c'
|
||
For Renesas SH architectures.
|
||
|
||
'sparc-stub.c'
|
||
For SPARC architectures.
|
||
|
||
'sparcl-stub.c'
|
||
For Fujitsu SPARCLITE architectures.
|
||
|
||
The 'README' file in the GDB distribution may list other recently
|
||
added stubs.
|
||
|
||
* Menu:
|
||
|
||
* Stub Contents:: What the stub can do for you
|
||
* Bootstrapping:: What you must do for the stub
|
||
* Debug Session:: Putting it all together
|
||
|
||
|
||
File: gdb.info, Node: Stub Contents, Next: Bootstrapping, Up: Remote Stub
|
||
|
||
20.5.1 What the Stub Can Do for You
|
||
-----------------------------------
|
||
|
||
The debugging stub for your architecture supplies these three
|
||
subroutines:
|
||
|
||
'set_debug_traps'
|
||
This routine arranges for 'handle_exception' to run when your
|
||
program stops. You must call this subroutine explicitly in your
|
||
program's startup code.
|
||
|
||
'handle_exception'
|
||
This is the central workhorse, but your program never calls it
|
||
explicitly--the setup code arranges for 'handle_exception' to run
|
||
when a trap is triggered.
|
||
|
||
'handle_exception' takes control when your program stops during
|
||
execution (for example, on a breakpoint), and mediates
|
||
communications with GDB on the host machine. This is where the
|
||
communications protocol is implemented; 'handle_exception' acts as
|
||
the GDB representative on the target machine. It begins by sending
|
||
summary information on the state of your program, then continues to
|
||
execute, retrieving and transmitting any information GDB needs,
|
||
until you execute a GDB command that makes your program resume; at
|
||
that point, 'handle_exception' returns control to your own code on
|
||
the target machine.
|
||
|
||
'breakpoint'
|
||
Use this auxiliary subroutine to make your program contain a
|
||
breakpoint. Depending on the particular situation, this may be the
|
||
only way for GDB to get control. For instance, if your target
|
||
machine has some sort of interrupt button, you won't need to call
|
||
this; pressing the interrupt button transfers control to
|
||
'handle_exception'--in effect, to GDB. On some machines, simply
|
||
receiving characters on the serial port may also trigger a trap;
|
||
again, in that situation, you don't need to call 'breakpoint' from
|
||
your own program--simply running 'target remote' from the host GDB
|
||
session gets control.
|
||
|
||
Call 'breakpoint' if none of these is true, or if you simply want
|
||
to make certain your program stops at a predetermined point for the
|
||
start of your debugging session.
|
||
|
||
|
||
File: gdb.info, Node: Bootstrapping, Next: Debug Session, Prev: Stub Contents, Up: Remote Stub
|
||
|
||
20.5.2 What You Must Do for the Stub
|
||
------------------------------------
|
||
|
||
The debugging stubs that come with GDB are set up for a particular chip
|
||
architecture, but they have no information about the rest of your
|
||
debugging target machine.
|
||
|
||
First of all you need to tell the stub how to communicate with the
|
||
serial port.
|
||
|
||
'int getDebugChar()'
|
||
Write this subroutine to read a single character from the serial
|
||
port. It may be identical to 'getchar' for your target system; a
|
||
different name is used to allow you to distinguish the two if you
|
||
wish.
|
||
|
||
'void putDebugChar(int)'
|
||
Write this subroutine to write a single character to the serial
|
||
port. It may be identical to 'putchar' for your target system; a
|
||
different name is used to allow you to distinguish the two if you
|
||
wish.
|
||
|
||
If you want GDB to be able to stop your program while it is running,
|
||
you need to use an interrupt-driven serial driver, and arrange for it to
|
||
stop when it receives a '^C' ('\003', the control-C character). That is
|
||
the character which GDB uses to tell the remote system to stop.
|
||
|
||
Getting the debugging target to return the proper status to GDB
|
||
probably requires changes to the standard stub; one quick and dirty way
|
||
is to just execute a breakpoint instruction (the "dirty" part is that
|
||
GDB reports a 'SIGTRAP' instead of a 'SIGINT').
|
||
|
||
Other routines you need to supply are:
|
||
|
||
'void exceptionHandler (int EXCEPTION_NUMBER, void *EXCEPTION_ADDRESS)'
|
||
Write this function to install EXCEPTION_ADDRESS in the exception
|
||
handling tables. You need to do this because the stub does not
|
||
have any way of knowing what the exception handling tables on your
|
||
target system are like (for example, the processor's table might be
|
||
in ROM, containing entries which point to a table in RAM). The
|
||
EXCEPTION_NUMBER specifies the exception which should be changed;
|
||
its meaning is architecture-dependent (for example, different
|
||
numbers might represent divide by zero, misaligned access, etc).
|
||
When this exception occurs, control should be transferred directly
|
||
to EXCEPTION_ADDRESS, and the processor state (stack, registers,
|
||
and so on) should be just as it is when a processor exception
|
||
occurs. So if you want to use a jump instruction to reach
|
||
EXCEPTION_ADDRESS, it should be a simple jump, not a jump to
|
||
subroutine.
|
||
|
||
For the 386, EXCEPTION_ADDRESS should be installed as an interrupt
|
||
gate so that interrupts are masked while the handler runs. The
|
||
gate should be at privilege level 0 (the most privileged level).
|
||
The SPARC and 68k stubs are able to mask interrupts themselves
|
||
without help from 'exceptionHandler'.
|
||
|
||
'void flush_i_cache()'
|
||
On SPARC and SPARCLITE only, write this subroutine to flush the
|
||
instruction cache, if any, on your target machine. If there is no
|
||
instruction cache, this subroutine may be a no-op.
|
||
|
||
On target machines that have instruction caches, GDB requires this
|
||
function to make certain that the state of your program is stable.
|
||
|
||
You must also make sure this library routine is available:
|
||
|
||
'void *memset(void *, int, int)'
|
||
This is the standard library function 'memset' that sets an area of
|
||
memory to a known value. If you have one of the free versions of
|
||
'libc.a', 'memset' can be found there; otherwise, you must either
|
||
obtain it from your hardware manufacturer, or write your own.
|
||
|
||
If you do not use the GNU C compiler, you may need other standard
|
||
library subroutines as well; this varies from one stub to another, but
|
||
in general the stubs are likely to use any of the common library
|
||
subroutines which 'GCC' generates as inline code.
|
||
|
||
|
||
File: gdb.info, Node: Debug Session, Prev: Bootstrapping, Up: Remote Stub
|
||
|
||
20.5.3 Putting it All Together
|
||
------------------------------
|
||
|
||
In summary, when your program is ready to debug, you must follow these
|
||
steps.
|
||
|
||
1. Make sure you have defined the supporting low-level routines (*note
|
||
What You Must Do for the Stub: Bootstrapping.):
|
||
'getDebugChar', 'putDebugChar',
|
||
'flush_i_cache', 'memset', 'exceptionHandler'.
|
||
|
||
2. Insert these lines in your program's startup code, before the main
|
||
procedure is called:
|
||
|
||
set_debug_traps();
|
||
breakpoint();
|
||
|
||
On some machines, when a breakpoint trap is raised, the hardware
|
||
automatically makes the PC point to the instruction after the
|
||
breakpoint. If your machine doesn't do that, you may need to
|
||
adjust 'handle_exception' to arrange for it to return to the
|
||
instruction after the breakpoint on this first invocation, so that
|
||
your program doesn't keep hitting the initial breakpoint instead of
|
||
making progress.
|
||
|
||
3. For the 680x0 stub only, you need to provide a variable called
|
||
'exceptionHook'. Normally you just use:
|
||
|
||
void (*exceptionHook)() = 0;
|
||
|
||
but if before calling 'set_debug_traps', you set it to point to a
|
||
function in your program, that function is called when 'GDB'
|
||
continues after stopping on a trap (for example, bus error). The
|
||
function indicated by 'exceptionHook' is called with one parameter:
|
||
an 'int' which is the exception number.
|
||
|
||
4. Compile and link together: your program, the GDB debugging stub for
|
||
your target architecture, and the supporting subroutines.
|
||
|
||
5. Make sure you have a serial connection between your target machine
|
||
and the GDB host, and identify the serial port on the host.
|
||
|
||
6. Download your program to your target machine (or get it there by
|
||
whatever means the manufacturer provides), and start it.
|
||
|
||
7. Start GDB on the host, and connect to the target (*note Connecting
|
||
to a Remote Target: Connecting.).
|
||
|
||
|
||
File: gdb.info, Node: Configurations, Next: Controlling GDB, Prev: Remote Debugging, Up: Top
|
||
|
||
21 Configuration-Specific Information
|
||
*************************************
|
||
|
||
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.
|
||
|
||
* Menu:
|
||
|
||
* Native::
|
||
* Embedded OS::
|
||
* Embedded Processors::
|
||
* Architectures::
|
||
|
||
|
||
File: gdb.info, Node: Native, Next: Embedded OS, Up: Configurations
|
||
|
||
21.1 Native
|
||
===========
|
||
|
||
This section describes details specific to particular native
|
||
configurations.
|
||
|
||
* Menu:
|
||
|
||
* HP-UX:: HP-UX
|
||
* BSD libkvm Interface:: Debugging BSD kernel memory images
|
||
* SVR4 Process Information:: SVR4 process information
|
||
* DJGPP Native:: Features specific to the DJGPP port
|
||
* Cygwin Native:: Features specific to the Cygwin port
|
||
* Hurd Native:: Features specific to GNU Hurd
|
||
* Darwin:: Features specific to Darwin
|
||
|
||
|
||
File: gdb.info, Node: HP-UX, Next: BSD libkvm Interface, Up: Native
|
||
|
||
21.1.1 HP-UX
|
||
------------
|
||
|
||
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.
|
||
|
||
|
||
File: gdb.info, Node: BSD libkvm Interface, Next: SVR4 Process Information, Prev: HP-UX, Up: Native
|
||
|
||
21.1.2 BSD libkvm Interface
|
||
---------------------------
|
||
|
||
BSD-derived systems (FreeBSD/NetBSD/OpenBSD) have a kernel memory
|
||
interface that provides a uniform interface for accessing kernel virtual
|
||
memory images, including live systems and crash dumps. GDB uses this
|
||
interface to allow you to debug live kernels and kernel crash dumps on
|
||
many native BSD configurations. This is implemented as a special 'kvm'
|
||
debugging target. For debugging a live system, load the currently
|
||
running kernel into GDB and connect to the 'kvm' target:
|
||
|
||
(gdb) target kvm
|
||
|
||
For debugging crash dumps, provide the file name of the crash dump as
|
||
an argument:
|
||
|
||
(gdb) target kvm /var/crash/bsd.0
|
||
|
||
Once connected to the 'kvm' target, the following commands are
|
||
available:
|
||
|
||
'kvm pcb'
|
||
Set current context from the "Process Control Block" (PCB) address.
|
||
|
||
'kvm proc'
|
||
Set current context from proc address. This command isn't
|
||
available on modern FreeBSD systems.
|
||
|
||
|
||
File: gdb.info, Node: SVR4 Process Information, Next: DJGPP Native, Prev: BSD libkvm Interface, Up: Native
|
||
|
||
21.1.3 SVR4 Process Information
|
||
-------------------------------
|
||
|
||
Many versions of SVR4 and compatible systems provide a facility called
|
||
'/proc' that can be used to examine the image of a running process using
|
||
file-system subroutines.
|
||
|
||
If GDB is configured for an operating system with this facility, the
|
||
command 'info proc' is available to report information about the process
|
||
running your program, or about any process running on your system. This
|
||
includes, as of this writing, GNU/Linux, OSF/1 (Digital Unix), Solaris,
|
||
and Irix, but not HP-UX, for example.
|
||
|
||
This command may also work on core files that were created on a
|
||
system that has the '/proc' facility.
|
||
|
||
'info proc'
|
||
'info proc PROCESS-ID'
|
||
Summarize available information about any running process. If a
|
||
process ID is specified by PROCESS-ID, display information about
|
||
that process; otherwise display information about the program being
|
||
debugged. The summary includes the debugged process ID, the
|
||
command line used to invoke it, its current working directory, and
|
||
its executable file's absolute file name.
|
||
|
||
On some systems, PROCESS-ID can be of the form '[PID]/TID' which
|
||
specifies a certain thread ID within a process. If the optional
|
||
PID part is missing, it means a thread from the process being
|
||
debugged (the leading '/' still needs to be present, or else GDB
|
||
will interpret the number as a process ID rather than a thread ID).
|
||
|
||
'info proc cmdline'
|
||
Show the original command line of the process. This command is
|
||
specific to GNU/Linux.
|
||
|
||
'info proc cwd'
|
||
Show the current working directory of the process. This command is
|
||
specific to GNU/Linux.
|
||
|
||
'info proc exe'
|
||
Show the name of executable of the process. This command is
|
||
specific to GNU/Linux.
|
||
|
||
'info proc mappings'
|
||
Report the memory address space ranges accessible in the program,
|
||
with information on whether the process has read, write, or execute
|
||
access rights to each range. On GNU/Linux systems, each memory
|
||
range includes the object file which is mapped to that range,
|
||
instead of the memory access rights to that range.
|
||
|
||
'info proc stat'
|
||
'info proc status'
|
||
These subcommands are specific to GNU/Linux systems. They show the
|
||
process-related information, including the user ID and group ID;
|
||
how many threads are there in the process; its virtual memory
|
||
usage; the signals that are pending, blocked, and ignored; its TTY;
|
||
its consumption of system and user time; its stack size; its 'nice'
|
||
value; etc. For more information, see the 'proc' man page (type
|
||
'man 5 proc' from your shell prompt).
|
||
|
||
'info proc all'
|
||
Show all the information about the process described under all of
|
||
the above 'info proc' subcommands.
|
||
|
||
'set procfs-trace'
|
||
This command enables and disables tracing of 'procfs' API calls.
|
||
|
||
'show procfs-trace'
|
||
Show the current state of 'procfs' API call tracing.
|
||
|
||
'set procfs-file FILE'
|
||
Tell GDB to write 'procfs' API trace to the named FILE. GDB
|
||
appends the trace info to the previous contents of the file. The
|
||
default is to display the trace on the standard output.
|
||
|
||
'show procfs-file'
|
||
Show the file to which 'procfs' API trace is written.
|
||
|
||
'proc-trace-entry'
|
||
'proc-trace-exit'
|
||
'proc-untrace-entry'
|
||
'proc-untrace-exit'
|
||
These commands enable and disable tracing of entries into and exits
|
||
from the 'syscall' interface.
|
||
|
||
'info pidlist'
|
||
For QNX Neutrino only, this command displays the list of all the
|
||
processes and all the threads within each process.
|
||
|
||
'info meminfo'
|
||
For QNX Neutrino only, this command displays the list of all
|
||
mapinfos.
|
||
|
||
|
||
File: gdb.info, Node: DJGPP Native, Next: Cygwin Native, Prev: SVR4 Process Information, Up: Native
|
||
|
||
21.1.4 Features for Debugging DJGPP Programs
|
||
--------------------------------------------
|
||
|
||
DJGPP is a port of the GNU development tools to MS-DOS and MS-Windows.
|
||
DJGPP programs are 32-bit protected-mode programs that use the "DPMI"
|
||
(DOS Protected-Mode Interface) API to run on top of real-mode DOS
|
||
systems and their emulations.
|
||
|
||
GDB supports native debugging of DJGPP programs, and defines a few
|
||
commands specific to the DJGPP port. This subsection describes those
|
||
commands.
|
||
|
||
'info dos'
|
||
This is a prefix of DJGPP-specific commands which print information
|
||
about the target system and important OS structures.
|
||
|
||
'info dos sysinfo'
|
||
This command displays assorted information about the underlying
|
||
platform: the CPU type and features, the OS version and flavor, the
|
||
DPMI version, and the available conventional and DPMI memory.
|
||
|
||
'info dos gdt'
|
||
'info dos ldt'
|
||
'info dos idt'
|
||
These 3 commands display entries from, respectively, Global, Local,
|
||
and Interrupt Descriptor Tables (GDT, LDT, and IDT). The descriptor
|
||
tables are data structures which store a descriptor for each
|
||
segment that is currently in use. The segment's selector is an
|
||
index into a descriptor table; the table entry for that index holds
|
||
the descriptor's base address and limit, and its attributes and
|
||
access rights.
|
||
|
||
A typical DJGPP program uses 3 segments: a code segment, a data
|
||
segment (used for both data and the stack), and a DOS segment
|
||
(which allows access to DOS/BIOS data structures and absolute
|
||
addresses in conventional memory). However, the DPMI host will
|
||
usually define additional segments in order to support the DPMI
|
||
environment.
|
||
|
||
These commands allow to display entries from the descriptor tables.
|
||
Without an argument, all entries from the specified table are
|
||
displayed. An argument, which should be an integer expression,
|
||
means display a single entry whose index is given by the argument.
|
||
For example, here's a convenient way to display information about
|
||
the debugged program's data segment:
|
||
|
||
(gdb) info dos ldt $ds
|
||
0x13f: base=0x11970000 limit=0x0009ffff 32-Bit Data (Read/Write, Exp-up)
|
||
|
||
This comes in handy when you want to see whether a pointer is
|
||
outside the data segment's limit (i.e. "garbled").
|
||
|
||
'info dos pde'
|
||
'info dos pte'
|
||
These two commands display entries from, respectively, the Page
|
||
Directory and the Page Tables. Page Directories and Page Tables
|
||
are data structures which control how virtual memory addresses are
|
||
mapped into physical addresses. A Page Table includes an entry for
|
||
every page of memory that is mapped into the program's address
|
||
space; there may be several Page Tables, each one holding up to
|
||
4096 entries. A Page Directory has up to 4096 entries, one each
|
||
for every Page Table that is currently in use.
|
||
|
||
Without an argument, 'info dos pde' displays the entire Page
|
||
Directory, and 'info dos pte' displays all the entries in all of
|
||
the Page Tables. An argument, an integer expression, given to the
|
||
'info dos pde' command means display only that entry from the Page
|
||
Directory table. An argument given to the 'info dos pte' command
|
||
means display entries from a single Page Table, the one pointed to
|
||
by the specified entry in the Page Directory.
|
||
|
||
These commands are useful when your program uses "DMA" (Direct
|
||
Memory Access), which needs physical addresses to program the DMA
|
||
controller.
|
||
|
||
These commands are supported only with some DPMI servers.
|
||
|
||
'info dos address-pte ADDR'
|
||
This command displays the Page Table entry for a specified linear
|
||
address. The argument ADDR is a linear address which should
|
||
already have the appropriate segment's base address added to it,
|
||
because this command accepts addresses which may belong to _any_
|
||
segment. For example, here's how to display the Page Table entry
|
||
for the page where a variable 'i' is stored:
|
||
|
||
(gdb) info dos address-pte __djgpp_base_address + (char *)&i
|
||
Page Table entry for address 0x11a00d30:
|
||
Base=0x02698000 Dirty Acc. Not-Cached Write-Back Usr Read-Write +0xd30
|
||
|
||
This says that 'i' is stored at offset '0xd30' from the page whose
|
||
physical base address is '0x02698000', and shows all the attributes
|
||
of that page.
|
||
|
||
Note that you must cast the addresses of variables to a 'char *',
|
||
since otherwise the value of '__djgpp_base_address', the base
|
||
address of all variables and functions in a DJGPP program, will be
|
||
added using the rules of C pointer arithmetics: if 'i' is declared
|
||
an 'int', GDB will add 4 times the value of '__djgpp_base_address'
|
||
to the address of 'i'.
|
||
|
||
Here's another example, it displays the Page Table entry for the
|
||
transfer buffer:
|
||
|
||
(gdb) info dos address-pte *((unsigned *)&_go32_info_block + 3)
|
||
Page Table entry for address 0x29110:
|
||
Base=0x00029000 Dirty Acc. Not-Cached Write-Back Usr Read-Write +0x110
|
||
|
||
(The '+ 3' offset is because the transfer buffer's address is the
|
||
3rd member of the '_go32_info_block' structure.) The output
|
||
clearly shows that this DPMI server maps the addresses in
|
||
conventional memory 1:1, i.e. the physical ('0x00029000' + '0x110')
|
||
and linear ('0x29110') addresses are identical.
|
||
|
||
This command is supported only with some DPMI servers.
|
||
|
||
In addition to native debugging, the DJGPP port supports remote
|
||
debugging via a serial data link. The following commands are specific
|
||
to remote serial debugging in the DJGPP port of GDB.
|
||
|
||
'set com1base ADDR'
|
||
This command sets the base I/O port address of the 'COM1' serial
|
||
port.
|
||
|
||
'set com1irq IRQ'
|
||
This command sets the "Interrupt Request" ('IRQ') line to use for
|
||
the 'COM1' serial port.
|
||
|
||
There are similar commands 'set com2base', 'set com3irq', etc. for
|
||
setting the port address and the 'IRQ' lines for the other 3 COM
|
||
ports.
|
||
|
||
The related commands 'show com1base', 'show com1irq' etc. display
|
||
the current settings of the base address and the 'IRQ' lines used
|
||
by the COM ports.
|
||
|
||
'info serial'
|
||
This command prints the status of the 4 DOS serial ports. For each
|
||
port, it prints whether it's active or not, its I/O base address
|
||
and IRQ number, whether it uses a 16550-style FIFO, its baudrate,
|
||
and the counts of various errors encountered so far.
|
||
|
||
|
||
File: gdb.info, Node: Cygwin Native, Next: Hurd Native, Prev: DJGPP Native, Up: Native
|
||
|
||
21.1.5 Features for Debugging MS Windows PE Executables
|
||
-------------------------------------------------------
|
||
|
||
GDB supports native debugging of MS Windows programs, including DLLs
|
||
with and without symbolic debugging information.
|
||
|
||
MS-Windows programs that call 'SetConsoleMode' to switch off the
|
||
special meaning of the 'Ctrl-C' keystroke cannot be interrupted by
|
||
typing 'C-c'. For this reason, GDB on MS-Windows supports 'C-<BREAK>'
|
||
as an alternative interrupt key sequence, which can be used to interrupt
|
||
the debuggee even if it ignores 'C-c'.
|
||
|
||
There are various additional Cygwin-specific commands, described in
|
||
this section. Working with DLLs that have no debugging symbols is
|
||
described in *note Non-debug DLL Symbols::.
|
||
|
||
'info w32'
|
||
This is a prefix of MS Windows-specific commands which print
|
||
information about the target system and important OS structures.
|
||
|
||
'info w32 selector'
|
||
This command displays information returned by the Win32 API
|
||
'GetThreadSelectorEntry' function. It takes an optional argument
|
||
that is evaluated to a long value to give the information about
|
||
this given selector. Without argument, this command displays
|
||
information about the six segment registers.
|
||
|
||
'info w32 thread-information-block'
|
||
This command displays thread specific information stored in the
|
||
Thread Information Block (readable on the X86 CPU family using
|
||
'$fs' selector for 32-bit programs and '$gs' for 64-bit programs).
|
||
|
||
'info dll'
|
||
This is a Cygwin-specific alias of 'info shared'.
|
||
|
||
'dll-symbols'
|
||
This command is deprecated and will be removed in future versions
|
||
of GDB. Use the 'sharedlibrary' command instead.
|
||
|
||
This command loads symbols from a dll similarly to add-sym command
|
||
but without the need to specify a base address.
|
||
|
||
'set cygwin-exceptions MODE'
|
||
If MODE is 'on', GDB will break on exceptions that happen inside
|
||
the Cygwin DLL. If MODE is 'off', GDB will delay recognition of
|
||
exceptions, and may ignore some exceptions which seem to be caused
|
||
by internal Cygwin DLL "bookkeeping". This option is meant
|
||
primarily for debugging the Cygwin DLL itself; the default value is
|
||
'off' to avoid annoying GDB users with false 'SIGSEGV' signals.
|
||
|
||
'show cygwin-exceptions'
|
||
Displays whether GDB will break on exceptions that happen inside
|
||
the Cygwin DLL itself.
|
||
|
||
'set new-console MODE'
|
||
If MODE is 'on' the debuggee will be started in a new console on
|
||
next start. If MODE is 'off', the debuggee will be started in the
|
||
same console as the debugger.
|
||
|
||
'show new-console'
|
||
Displays whether a new console is used when the debuggee is
|
||
started.
|
||
|
||
'set new-group MODE'
|
||
This boolean value controls whether the debuggee should start a new
|
||
group or stay in the same group as the debugger. This affects the
|
||
way the Windows OS handles 'Ctrl-C'.
|
||
|
||
'show new-group'
|
||
Displays current value of new-group boolean.
|
||
|
||
'set debugevents'
|
||
This boolean value adds debug output concerning kernel events
|
||
related to the debuggee seen by the debugger. This includes events
|
||
that signal thread and process creation and exit, DLL loading and
|
||
unloading, console interrupts, and debugging messages produced by
|
||
the Windows 'OutputDebugString' API call.
|
||
|
||
'set debugexec'
|
||
This boolean value adds debug output concerning execute events
|
||
(such as resume thread) seen by the debugger.
|
||
|
||
'set debugexceptions'
|
||
This boolean value adds debug output concerning exceptions in the
|
||
debuggee seen by the debugger.
|
||
|
||
'set debugmemory'
|
||
This boolean value adds debug output concerning debuggee memory
|
||
reads and writes by the debugger.
|
||
|
||
'set shell'
|
||
This boolean values specifies whether the debuggee is called via a
|
||
shell or directly (default value is on).
|
||
|
||
'show shell'
|
||
Displays if the debuggee will be started with a shell.
|
||
|
||
* Menu:
|
||
|
||
* Non-debug DLL Symbols:: Support for DLLs without debugging symbols
|
||
|
||
|
||
File: gdb.info, Node: Non-debug DLL Symbols, Up: Cygwin Native
|
||
|
||
21.1.5.1 Support for DLLs without Debugging Symbols
|
||
...................................................
|
||
|
||
Very often on windows, some of the DLLs that your program relies on do
|
||
not include symbolic debugging information (for example,
|
||
'kernel32.dll'). When GDB doesn't recognize any debugging symbols in a
|
||
DLL, it relies on the minimal amount of symbolic information contained
|
||
in the DLL's export table. This section describes working with such
|
||
symbols, known internally to GDB as "minimal symbols".
|
||
|
||
Note that before the debugged program has started execution, no DLLs
|
||
will have been loaded. The easiest way around this problem is simply to
|
||
start the program -- either by setting a breakpoint or letting the
|
||
program run once to completion.
|
||
|
||
21.1.5.2 DLL Name Prefixes
|
||
..........................
|
||
|
||
In keeping with the naming conventions used by the Microsoft debugging
|
||
tools, DLL export symbols are made available with a prefix based on the
|
||
DLL name, for instance 'KERNEL32!CreateFileA'. The plain name is also
|
||
entered into the symbol table, so 'CreateFileA' is often sufficient. In
|
||
some cases there will be name clashes within a program (particularly if
|
||
the executable itself includes full debugging symbols) necessitating the
|
||
use of the fully qualified name when referring to the contents of the
|
||
DLL. Use single-quotes around the name to avoid the exclamation mark
|
||
("!") being interpreted as a language operator.
|
||
|
||
Note that the internal name of the DLL may be all upper-case, even
|
||
though the file name of the DLL is lower-case, or vice-versa. Since
|
||
symbols within GDB are _case-sensitive_ this may cause some confusion.
|
||
If in doubt, try the 'info functions' and 'info variables' commands or
|
||
even 'maint print msymbols' (*note Symbols::). Here's an example:
|
||
|
||
(gdb) info function CreateFileA
|
||
All functions matching regular expression "CreateFileA":
|
||
|
||
Non-debugging symbols:
|
||
0x77e885f4 CreateFileA
|
||
0x77e885f4 KERNEL32!CreateFileA
|
||
|
||
(gdb) info function !
|
||
All functions matching regular expression "!":
|
||
|
||
Non-debugging symbols:
|
||
0x6100114c cygwin1!__assert
|
||
0x61004034 cygwin1!_dll_crt0@0
|
||
0x61004240 cygwin1!dll_crt0(per_process *)
|
||
[etc...]
|
||
|
||
21.1.5.3 Working with Minimal Symbols
|
||
.....................................
|
||
|
||
Symbols extracted from a DLL's export table do not contain very much
|
||
type information. All that GDB can do is guess whether a symbol refers
|
||
to a function or variable depending on the linker section that contains
|
||
the symbol. Also note that the actual contents of the memory contained
|
||
in a DLL are not available unless the program is running. This means
|
||
that you cannot examine the contents of a variable or disassemble a
|
||
function within a DLL without a running program.
|
||
|
||
Variables are generally treated as pointers and dereferenced
|
||
automatically. For this reason, it is often necessary to prefix a
|
||
variable name with the address-of operator ("&") and provide explicit
|
||
type information in the command. Here's an example of the type of
|
||
problem:
|
||
|
||
(gdb) print 'cygwin1!__argv'
|
||
$1 = 268572168
|
||
|
||
(gdb) x 'cygwin1!__argv'
|
||
0x10021610: "\230y\""
|
||
|
||
And two possible solutions:
|
||
|
||
(gdb) print ((char **)'cygwin1!__argv')[0]
|
||
$2 = 0x22fd98 "/cygdrive/c/mydirectory/myprogram"
|
||
|
||
(gdb) x/2x &'cygwin1!__argv'
|
||
0x610c0aa8 <cygwin1!__argv>: 0x10021608 0x00000000
|
||
(gdb) x/x 0x10021608
|
||
0x10021608: 0x0022fd98
|
||
(gdb) x/s 0x0022fd98
|
||
0x22fd98: "/cygdrive/c/mydirectory/myprogram"
|
||
|
||
Setting a break point within a DLL is possible even before the
|
||
program starts execution. However, under these circumstances, GDB can't
|
||
examine the initial instructions of the function in order to skip the
|
||
function's frame set-up code. You can work around this by using "*&" to
|
||
set the breakpoint at a raw memory address:
|
||
|
||
(gdb) break *&'python22!PyOS_Readline'
|
||
Breakpoint 1 at 0x1e04eff0
|
||
|
||
The author of these extensions is not entirely convinced that setting
|
||
a break point within a shared DLL like 'kernel32.dll' is completely
|
||
safe.
|
||
|
||
|
||
File: gdb.info, Node: Hurd Native, Next: Darwin, Prev: Cygwin Native, Up: Native
|
||
|
||
21.1.6 Commands Specific to GNU Hurd Systems
|
||
--------------------------------------------
|
||
|
||
This subsection describes GDB commands specific to the GNU Hurd native
|
||
debugging.
|
||
|
||
'set signals'
|
||
'set sigs'
|
||
This command toggles the state of inferior signal interception by
|
||
GDB. Mach exceptions, such as breakpoint traps, are not affected
|
||
by this command. 'sigs' is a shorthand alias for 'signals'.
|
||
|
||
'show signals'
|
||
'show sigs'
|
||
Show the current state of intercepting inferior's signals.
|
||
|
||
'set signal-thread'
|
||
'set sigthread'
|
||
This command tells GDB which thread is the 'libc' signal thread.
|
||
That thread is run when a signal is delivered to a running process.
|
||
'set sigthread' is the shorthand alias of 'set signal-thread'.
|
||
|
||
'show signal-thread'
|
||
'show sigthread'
|
||
These two commands show which thread will run when the inferior is
|
||
delivered a signal.
|
||
|
||
'set stopped'
|
||
This commands tells GDB that the inferior process is stopped, as
|
||
with the 'SIGSTOP' signal. The stopped process can be continued by
|
||
delivering a signal to it.
|
||
|
||
'show stopped'
|
||
This command shows whether GDB thinks the debuggee is stopped.
|
||
|
||
'set exceptions'
|
||
Use this command to turn off trapping of exceptions in the
|
||
inferior. When exception trapping is off, neither breakpoints nor
|
||
single-stepping will work. To restore the default, set exception
|
||
trapping on.
|
||
|
||
'show exceptions'
|
||
Show the current state of trapping exceptions in the inferior.
|
||
|
||
'set task pause'
|
||
This command toggles task suspension when GDB has control. Setting
|
||
it to on takes effect immediately, and the task is suspended
|
||
whenever GDB gets control. Setting it to off will take effect the
|
||
next time the inferior is continued. If this option is set to off,
|
||
you can use 'set thread default pause on' or 'set thread pause on'
|
||
(see below) to pause individual threads.
|
||
|
||
'show task pause'
|
||
Show the current state of task suspension.
|
||
|
||
'set task detach-suspend-count'
|
||
This command sets the suspend count the task will be left with when
|
||
GDB detaches from it.
|
||
|
||
'show task detach-suspend-count'
|
||
Show the suspend count the task will be left with when detaching.
|
||
|
||
'set task exception-port'
|
||
'set task excp'
|
||
This command sets the task exception port to which GDB will forward
|
||
exceptions. The argument should be the value of the "send rights"
|
||
of the task. 'set task excp' is a shorthand alias.
|
||
|
||
'set noninvasive'
|
||
This command switches GDB to a mode that is the least invasive as
|
||
far as interfering with the inferior is concerned. This is the
|
||
same as using 'set task pause', 'set exceptions', and 'set signals'
|
||
to values opposite to the defaults.
|
||
|
||
'info send-rights'
|
||
'info receive-rights'
|
||
'info port-rights'
|
||
'info port-sets'
|
||
'info dead-names'
|
||
'info ports'
|
||
'info psets'
|
||
These commands display information about, respectively, send
|
||
rights, receive rights, port rights, port sets, and dead names of a
|
||
task. There are also shorthand aliases: 'info ports' for 'info
|
||
port-rights' and 'info psets' for 'info port-sets'.
|
||
|
||
'set thread pause'
|
||
This command toggles current thread suspension when GDB has
|
||
control. Setting it to on takes effect immediately, and the
|
||
current thread is suspended whenever GDB gets control. Setting it
|
||
to off will take effect the next time the inferior is continued.
|
||
Normally, this command has no effect, since when GDB has control,
|
||
the whole task is suspended. However, if you used 'set task pause
|
||
off' (see above), this command comes in handy to suspend only the
|
||
current thread.
|
||
|
||
'show thread pause'
|
||
This command shows the state of current thread suspension.
|
||
|
||
'set thread run'
|
||
This command sets whether the current thread is allowed to run.
|
||
|
||
'show thread run'
|
||
Show whether the current thread is allowed to run.
|
||
|
||
'set thread detach-suspend-count'
|
||
This command sets the suspend count GDB will leave on a thread when
|
||
detaching. This number is relative to the suspend count found by
|
||
GDB when it notices the thread; use 'set thread
|
||
takeover-suspend-count' to force it to an absolute value.
|
||
|
||
'show thread detach-suspend-count'
|
||
Show the suspend count GDB will leave on the thread when detaching.
|
||
|
||
'set thread exception-port'
|
||
'set thread excp'
|
||
Set the thread exception port to which to forward exceptions. This
|
||
overrides the port set by 'set task exception-port' (see above).
|
||
'set thread excp' is the shorthand alias.
|
||
|
||
'set thread takeover-suspend-count'
|
||
Normally, GDB's thread suspend counts are relative to the value GDB
|
||
finds when it notices each thread. This command changes the
|
||
suspend counts to be absolute instead.
|
||
|
||
'set thread default'
|
||
'show thread default'
|
||
Each of the above 'set thread' commands has a 'set thread default'
|
||
counterpart (e.g., 'set thread default pause', 'set thread default
|
||
exception-port', etc.). The 'thread default' variety of commands
|
||
sets the default thread properties for all threads; you can then
|
||
change the properties of individual threads with the non-default
|
||
commands.
|
||
|
||
|
||
File: gdb.info, Node: Darwin, Prev: Hurd Native, Up: Native
|
||
|
||
21.1.7 Darwin
|
||
-------------
|
||
|
||
GDB provides the following commands specific to the Darwin target:
|
||
|
||
'set debug darwin NUM'
|
||
When set to a non zero value, enables debugging messages specific
|
||
to the Darwin support. Higher values produce more verbose output.
|
||
|
||
'show debug darwin'
|
||
Show the current state of Darwin messages.
|
||
|
||
'set debug mach-o NUM'
|
||
When set to a non zero value, enables debugging messages while GDB
|
||
is reading Darwin object files. ("Mach-O" is the file format used
|
||
on Darwin for object and executable files.) Higher values produce
|
||
more verbose output. This is a command to diagnose problems
|
||
internal to GDB and should not be needed in normal usage.
|
||
|
||
'show debug mach-o'
|
||
Show the current state of Mach-O file messages.
|
||
|
||
'set mach-exceptions on'
|
||
'set mach-exceptions off'
|
||
On Darwin, faults are first reported as a Mach exception and are
|
||
then mapped to a Posix signal. Use this command to turn on
|
||
trapping of Mach exceptions in the inferior. This might be
|
||
sometimes useful to better understand the cause of a fault. The
|
||
default is off.
|
||
|
||
'show mach-exceptions'
|
||
Show the current state of exceptions trapping.
|
||
|
||
|
||
File: gdb.info, Node: Embedded OS, Next: Embedded Processors, Prev: Native, Up: Configurations
|
||
|
||
21.2 Embedded Operating Systems
|
||
===============================
|
||
|
||
This section describes configurations involving the debugging of
|
||
embedded operating systems that are available for several different
|
||
architectures.
|
||
|
||
* Menu:
|
||
|
||
* VxWorks:: Using GDB with VxWorks
|
||
|
||
GDB includes the ability to debug programs running on various
|
||
real-time operating systems.
|
||
|
||
|
||
File: gdb.info, Node: VxWorks, Up: Embedded OS
|
||
|
||
21.2.1 Using GDB with VxWorks
|
||
-----------------------------
|
||
|
||
'target vxworks MACHINENAME'
|
||
A VxWorks system, attached via TCP/IP. The argument MACHINENAME is
|
||
the target system's machine name or IP address.
|
||
|
||
On VxWorks, 'load' links FILENAME dynamically on the current target
|
||
system as well as adding its symbols in GDB.
|
||
|
||
GDB enables developers to spawn and debug tasks running on networked
|
||
VxWorks targets from a Unix host. Already-running tasks spawned from
|
||
the VxWorks shell can also be debugged. GDB uses code that runs on both
|
||
the Unix host and on the VxWorks target. The program 'gdb' is installed
|
||
and executed on the Unix host. (It may be installed with the name
|
||
'vxgdb', to distinguish it from a GDB for debugging programs on the host
|
||
itself.)
|
||
|
||
'VxWorks-timeout ARGS'
|
||
All VxWorks-based targets now support the option 'vxworks-timeout'.
|
||
This option is set by the user, and ARGS represents the number of
|
||
seconds GDB waits for responses to rpc's. You might use this if
|
||
your VxWorks target is a slow software simulator or is on the far
|
||
side of a thin network line.
|
||
|
||
The following information on connecting to VxWorks was current when
|
||
this manual was produced; newer releases of VxWorks may use revised
|
||
procedures.
|
||
|
||
To use GDB with VxWorks, you must rebuild your VxWorks kernel to
|
||
include the remote debugging interface routines in the VxWorks library
|
||
'rdb.a'. To do this, define 'INCLUDE_RDB' in the VxWorks configuration
|
||
file 'configAll.h' and rebuild your VxWorks kernel. The resulting
|
||
kernel contains 'rdb.a', and spawns the source debugging task 'tRdbTask'
|
||
when VxWorks is booted. For more information on configuring and
|
||
remaking VxWorks, see the manufacturer's manual.
|
||
|
||
Once you have included 'rdb.a' in your VxWorks system image and set
|
||
your Unix execution search path to find GDB, you are ready to run GDB.
|
||
From your Unix host, run 'gdb' (or 'vxgdb', depending on your
|
||
installation).
|
||
|
||
GDB comes up showing the prompt:
|
||
|
||
(vxgdb)
|
||
|
||
* Menu:
|
||
|
||
* VxWorks Connection:: Connecting to VxWorks
|
||
* VxWorks Download:: VxWorks download
|
||
* VxWorks Attach:: Running tasks
|
||
|
||
|
||
File: gdb.info, Node: VxWorks Connection, Next: VxWorks Download, Up: VxWorks
|
||
|
||
21.2.1.1 Connecting to VxWorks
|
||
..............................
|
||
|
||
The GDB command 'target' lets you connect to a VxWorks target on the
|
||
network. To connect to a target whose host name is "'tt'", type:
|
||
|
||
(vxgdb) target vxworks tt
|
||
|
||
GDB displays messages like these:
|
||
|
||
Attaching remote machine across net...
|
||
Connected to tt.
|
||
|
||
GDB then attempts to read the symbol tables of any object modules
|
||
loaded into the VxWorks target since it was last booted. GDB locates
|
||
these files by searching the directories listed in the command search
|
||
path (*note Your Program's Environment: Environment.); if it fails to
|
||
find an object file, it displays a message such as:
|
||
|
||
prog.o: No such file or directory.
|
||
|
||
When this happens, add the appropriate directory to the search path
|
||
with the GDB command 'path', and execute the 'target' command again.
|
||
|
||
|
||
File: gdb.info, Node: VxWorks Download, Next: VxWorks Attach, Prev: VxWorks Connection, Up: VxWorks
|
||
|
||
21.2.1.2 VxWorks Download
|
||
.........................
|
||
|
||
If you have connected to the VxWorks target and you want to debug an
|
||
object that has not yet been loaded, you can use the GDB 'load' command
|
||
to download a file from Unix to VxWorks incrementally. The object file
|
||
given as an argument to the 'load' command is actually opened twice:
|
||
first by the VxWorks target in order to download the code, then by GDB
|
||
in order to read the symbol table. This can lead to problems if the
|
||
current working directories on the two systems differ. If both systems
|
||
have NFS mounted the same filesystems, you can avoid these problems by
|
||
using absolute paths. Otherwise, it is simplest to set the working
|
||
directory on both systems to the directory in which the object file
|
||
resides, and then to reference the file by its name, without any path.
|
||
For instance, a program 'prog.o' may reside in 'VXPATH/vw/demo/rdb' in
|
||
VxWorks and in 'HOSTPATH/vw/demo/rdb' on the host. To load this
|
||
program, type this on VxWorks:
|
||
|
||
-> cd "VXPATH/vw/demo/rdb"
|
||
|
||
Then, in GDB, type:
|
||
|
||
(vxgdb) cd HOSTPATH/vw/demo/rdb
|
||
(vxgdb) load prog.o
|
||
|
||
GDB displays a response similar to this:
|
||
|
||
Reading symbol data from wherever/vw/demo/rdb/prog.o... done.
|
||
|
||
You can also use the 'load' command to reload an object module after
|
||
editing and recompiling the corresponding source file. Note that this
|
||
makes GDB delete all currently-defined breakpoints, auto-displays, and
|
||
convenience variables, and to clear the value history. (This is
|
||
necessary in order to preserve the integrity of debugger's data
|
||
structures that reference the target system's symbol table.)
|
||
|
||
|
||
File: gdb.info, Node: VxWorks Attach, Prev: VxWorks Download, Up: VxWorks
|
||
|
||
21.2.1.3 Running Tasks
|
||
......................
|
||
|
||
You can also attach to an existing task using the 'attach' command as
|
||
follows:
|
||
|
||
(vxgdb) attach TASK
|
||
|
||
where TASK is the VxWorks hexadecimal task ID. The task can be running
|
||
or suspended when you attach to it. Running tasks are suspended at the
|
||
time of attachment.
|
||
|
||
|
||
File: gdb.info, Node: Embedded Processors, Next: Architectures, Prev: Embedded OS, Up: Configurations
|
||
|
||
21.3 Embedded Processors
|
||
========================
|
||
|
||
This section goes into details specific to particular embedded
|
||
configurations.
|
||
|
||
Whenever a specific embedded processor has a simulator, GDB allows to
|
||
send an arbitrary command to the simulator.
|
||
|
||
'sim COMMAND'
|
||
Send an arbitrary COMMAND string to the simulator. Consult the
|
||
documentation for the specific simulator in use for information
|
||
about acceptable commands.
|
||
|
||
* Menu:
|
||
|
||
* ARM:: ARM RDI
|
||
* M32R/D:: Renesas M32R/D
|
||
* M68K:: Motorola M68K
|
||
* MicroBlaze:: Xilinx MicroBlaze
|
||
* MIPS Embedded:: MIPS Embedded
|
||
* PowerPC Embedded:: PowerPC Embedded
|
||
* PA:: HP PA Embedded
|
||
* Sparclet:: Tsqware Sparclet
|
||
* Sparclite:: Fujitsu Sparclite
|
||
* Z8000:: Zilog Z8000
|
||
* AVR:: Atmel AVR
|
||
* CRIS:: CRIS
|
||
* Super-H:: Renesas Super-H
|
||
|
||
|
||
File: gdb.info, Node: ARM, Next: M32R/D, Up: Embedded Processors
|
||
|
||
21.3.1 ARM
|
||
----------
|
||
|
||
'target rdi DEV'
|
||
ARM Angel monitor, via RDI library interface to ADP protocol. You
|
||
may use this target to communicate with both boards running the
|
||
Angel monitor, or with the EmbeddedICE JTAG debug device.
|
||
|
||
'target rdp DEV'
|
||
ARM Demon monitor.
|
||
|
||
GDB provides the following ARM-specific commands:
|
||
|
||
'set arm disassembler'
|
||
This commands selects from a list of disassembly styles. The
|
||
'"std"' style is the standard style.
|
||
|
||
'show arm disassembler'
|
||
Show the current disassembly style.
|
||
|
||
'set arm apcs32'
|
||
This command toggles ARM operation mode between 32-bit and 26-bit.
|
||
|
||
'show arm apcs32'
|
||
Display the current usage of the ARM 32-bit mode.
|
||
|
||
'set arm fpu FPUTYPE'
|
||
This command sets the ARM floating-point unit (FPU) type. The
|
||
argument FPUTYPE can be one of these:
|
||
|
||
'auto'
|
||
Determine the FPU type by querying the OS ABI.
|
||
'softfpa'
|
||
Software FPU, with mixed-endian doubles on little-endian ARM
|
||
processors.
|
||
'fpa'
|
||
GCC-compiled FPA co-processor.
|
||
'softvfp'
|
||
Software FPU with pure-endian doubles.
|
||
'vfp'
|
||
VFP co-processor.
|
||
|
||
'show arm fpu'
|
||
Show the current type of the FPU.
|
||
|
||
'set arm abi'
|
||
This command forces GDB to use the specified ABI.
|
||
|
||
'show arm abi'
|
||
Show the currently used ABI.
|
||
|
||
'set arm fallback-mode (arm|thumb|auto)'
|
||
GDB uses the symbol table, when available, to determine whether
|
||
instructions are ARM or Thumb. This command controls GDB's default
|
||
behavior when the symbol table is not available. The default is
|
||
'auto', which causes GDB to use the current execution mode (from
|
||
the 'T' bit in the 'CPSR' register).
|
||
|
||
'show arm fallback-mode'
|
||
Show the current fallback instruction mode.
|
||
|
||
'set arm force-mode (arm|thumb|auto)'
|
||
This command overrides use of the symbol table to determine whether
|
||
instructions are ARM or Thumb. The default is 'auto', which causes
|
||
GDB to use the symbol table and then the setting of 'set arm
|
||
fallback-mode'.
|
||
|
||
'show arm force-mode'
|
||
Show the current forced instruction mode.
|
||
|
||
'set debug arm'
|
||
Toggle whether to display ARM-specific debugging messages from the
|
||
ARM target support subsystem.
|
||
|
||
'show debug arm'
|
||
Show whether ARM-specific debugging messages are enabled.
|
||
|
||
The following commands are available when an ARM target is debugged
|
||
using the RDI interface:
|
||
|
||
'rdilogfile [FILE]'
|
||
Set the filename for the ADP (Angel Debugger Protocol) packet log.
|
||
With an argument, sets the log file to the specified FILE. With no
|
||
argument, show the current log file name. The default log file is
|
||
'rdi.log'.
|
||
|
||
'rdilogenable [ARG]'
|
||
Control logging of ADP packets. With an argument of 1 or '"yes"'
|
||
enables logging, with an argument 0 or '"no"' disables it. With no
|
||
arguments displays the current setting. When logging is enabled,
|
||
ADP packets exchanged between GDB and the RDI target device are
|
||
logged to a file.
|
||
|
||
'set rdiromatzero'
|
||
Tell GDB whether the target has ROM at address 0. If on, vector
|
||
catching is disabled, so that zero address can be used. If off
|
||
(the default), vector catching is enabled. For this command to
|
||
take effect, it needs to be invoked prior to the 'target rdi'
|
||
command.
|
||
|
||
'show rdiromatzero'
|
||
Show the current setting of ROM at zero address.
|
||
|
||
'set rdiheartbeat'
|
||
Enable or disable RDI heartbeat packets. It is not recommended to
|
||
turn on this option, since it confuses ARM and EPI JTAG interface,
|
||
as well as the Angel monitor.
|
||
|
||
'show rdiheartbeat'
|
||
Show the setting of RDI heartbeat packets.
|
||
|
||
'target sim [SIMARGS] ...'
|
||
The GDB ARM simulator accepts the following optional arguments.
|
||
|
||
'--swi-support=TYPE'
|
||
Tell the simulator which SWI interfaces to support. The
|
||
argument TYPE may be a comma separated list of the following
|
||
values. The default value is 'all'.
|
||
|
||
'none'
|
||
'demon'
|
||
'angel'
|
||
'redboot'
|
||
'all'
|
||
|
||
|
||
File: gdb.info, Node: M32R/D, Next: M68K, Prev: ARM, Up: Embedded Processors
|
||
|
||
21.3.2 Renesas M32R/D and M32R/SDI
|
||
----------------------------------
|
||
|
||
'target m32r DEV'
|
||
Renesas M32R/D ROM monitor.
|
||
|
||
'target m32rsdi DEV'
|
||
Renesas M32R SDI server, connected via parallel port to the board.
|
||
|
||
The following GDB commands are specific to the M32R monitor:
|
||
|
||
'set download-path PATH'
|
||
Set the default path for finding downloadable SREC files.
|
||
|
||
'show download-path'
|
||
Show the default path for downloadable SREC files.
|
||
|
||
'set board-address ADDR'
|
||
Set the IP address for the M32R-EVA target board.
|
||
|
||
'show board-address'
|
||
Show the current IP address of the target board.
|
||
|
||
'set server-address ADDR'
|
||
Set the IP address for the download server, which is the GDB's host
|
||
machine.
|
||
|
||
'show server-address'
|
||
Display the IP address of the download server.
|
||
|
||
'upload [FILE]'
|
||
Upload the specified SREC FILE via the monitor's Ethernet upload
|
||
capability. If no FILE argument is given, the current executable
|
||
file is uploaded.
|
||
|
||
'tload [FILE]'
|
||
Test the 'upload' command.
|
||
|
||
The following commands are available for M32R/SDI:
|
||
|
||
'sdireset'
|
||
This command resets the SDI connection.
|
||
|
||
'sdistatus'
|
||
This command shows the SDI connection status.
|
||
|
||
'debug_chaos'
|
||
Instructs the remote that M32R/Chaos debugging is to be used.
|
||
|
||
'use_debug_dma'
|
||
Instructs the remote to use the DEBUG_DMA method of accessing
|
||
memory.
|
||
|
||
'use_mon_code'
|
||
Instructs the remote to use the MON_CODE method of accessing
|
||
memory.
|
||
|
||
'use_ib_break'
|
||
Instructs the remote to set breakpoints by IB break.
|
||
|
||
'use_dbt_break'
|
||
Instructs the remote to set breakpoints by DBT.
|
||
|
||
|
||
File: gdb.info, Node: M68K, Next: MicroBlaze, Prev: M32R/D, Up: Embedded Processors
|
||
|
||
21.3.3 M68k
|
||
-----------
|
||
|
||
The Motorola m68k configuration includes ColdFire support, and a target
|
||
command for the following ROM monitor.
|
||
|
||
'target dbug DEV'
|
||
dBUG ROM monitor for Motorola ColdFire.
|
||
|
||
|
||
File: gdb.info, Node: MicroBlaze, Next: MIPS Embedded, Prev: M68K, Up: Embedded Processors
|
||
|
||
21.3.4 MicroBlaze
|
||
-----------------
|
||
|
||
The MicroBlaze is a soft-core processor supported on various Xilinx
|
||
FPGAs, such as Spartan or Virtex series. Boards with these processors
|
||
usually have JTAG ports which connect to a host system running the
|
||
Xilinx Embedded Development Kit (EDK) or Software Development Kit (SDK).
|
||
This host system is used to download the configuration bitstream to the
|
||
target FPGA. The Xilinx Microprocessor Debugger (XMD) program
|
||
communicates with the target board using the JTAG interface and presents
|
||
a 'gdbserver' interface to the board. By default 'xmd' uses port
|
||
'1234'. (While it is possible to change this default port, it requires
|
||
the use of undocumented 'xmd' commands. Contact Xilinx support if you
|
||
need to do this.)
|
||
|
||
Use these GDB commands to connect to the MicroBlaze target processor.
|
||
|
||
'target remote :1234'
|
||
Use this command to connect to the target if you are running GDB on
|
||
the same system as 'xmd'.
|
||
|
||
'target remote XMD-HOST:1234'
|
||
Use this command to connect to the target if it is connected to
|
||
'xmd' running on a different system named XMD-HOST.
|
||
|
||
'load'
|
||
Use this command to download a program to the MicroBlaze target.
|
||
|
||
'set debug microblaze N'
|
||
Enable MicroBlaze-specific debugging messages if non-zero.
|
||
|
||
'show debug microblaze N'
|
||
Show MicroBlaze-specific debugging level.
|
||
|
||
|
||
File: gdb.info, Node: MIPS Embedded, Next: PowerPC Embedded, Prev: MicroBlaze, Up: Embedded Processors
|
||
|
||
21.3.5 MIPS Embedded
|
||
--------------------
|
||
|
||
GDB can use the MIPS remote debugging protocol to talk to a MIPS board
|
||
attached to a serial line. This is available when you configure GDB
|
||
with '--target=mips-elf'.
|
||
|
||
Use these GDB commands to specify the connection to your target
|
||
board:
|
||
|
||
'target mips PORT'
|
||
To run a program on the board, start up 'gdb' with the name of your
|
||
program as the argument. To connect to the board, use the command
|
||
'target mips PORT', where PORT is the name of the serial port
|
||
connected to the board. If the program has not already been
|
||
downloaded to the board, you may use the 'load' command to download
|
||
it. You can then use all the usual GDB commands.
|
||
|
||
For example, this sequence connects to the target board through a
|
||
serial port, and loads and runs a program called PROG through the
|
||
debugger:
|
||
|
||
host$ gdb PROG
|
||
GDB is free software and ...
|
||
(gdb) target mips /dev/ttyb
|
||
(gdb) load PROG
|
||
(gdb) run
|
||
|
||
'target mips HOSTNAME:PORTNUMBER'
|
||
On some GDB host configurations, you can specify a TCP connection
|
||
(for instance, to a serial line managed by a terminal concentrator)
|
||
instead of a serial port, using the syntax 'HOSTNAME:PORTNUMBER'.
|
||
|
||
'target pmon PORT'
|
||
PMON ROM monitor.
|
||
|
||
'target ddb PORT'
|
||
NEC's DDB variant of PMON for Vr4300.
|
||
|
||
'target lsi PORT'
|
||
LSI variant of PMON.
|
||
|
||
'target r3900 DEV'
|
||
Densan DVE-R3900 ROM monitor for Toshiba R3900 Mips.
|
||
|
||
'target array DEV'
|
||
Array Tech LSI33K RAID controller board.
|
||
|
||
GDB also supports these special commands for MIPS targets:
|
||
|
||
'set mipsfpu double'
|
||
'set mipsfpu single'
|
||
'set mipsfpu none'
|
||
'set mipsfpu auto'
|
||
'show mipsfpu'
|
||
If your target board does not support the MIPS floating point
|
||
coprocessor, you should use the command 'set mipsfpu none' (if you
|
||
need this, you may wish to put the command in your GDB init file).
|
||
This tells GDB how to find the return value of functions which
|
||
return floating point values. It also allows GDB to avoid saving
|
||
the floating point registers when calling functions on the board.
|
||
If you are using a floating point coprocessor with only single
|
||
precision floating point support, as on the R4650 processor, use
|
||
the command 'set mipsfpu single'. The default double precision
|
||
floating point coprocessor may be selected using 'set mipsfpu
|
||
double'.
|
||
|
||
In previous versions the only choices were double precision or no
|
||
floating point, so 'set mipsfpu on' will select double precision
|
||
and 'set mipsfpu off' will select no floating point.
|
||
|
||
As usual, you can inquire about the 'mipsfpu' variable with 'show
|
||
mipsfpu'.
|
||
|
||
'set timeout SECONDS'
|
||
'set retransmit-timeout SECONDS'
|
||
'show timeout'
|
||
'show retransmit-timeout'
|
||
You can control the timeout used while waiting for a packet, in the
|
||
MIPS remote protocol, with the 'set timeout SECONDS' command. The
|
||
default is 5 seconds. Similarly, you can control the timeout used
|
||
while waiting for an acknowledgment of a packet with the 'set
|
||
retransmit-timeout SECONDS' command. The default is 3 seconds.
|
||
You can inspect both values with 'show timeout' and 'show
|
||
retransmit-timeout'. (These commands are _only_ available when GDB
|
||
is configured for '--target=mips-elf'.)
|
||
|
||
The timeout set by 'set timeout' does not apply when GDB is waiting
|
||
for your program to stop. In that case, GDB waits forever because
|
||
it has no way of knowing how long the program is going to run
|
||
before stopping.
|
||
|
||
'set syn-garbage-limit NUM'
|
||
Limit the maximum number of characters GDB should ignore when it
|
||
tries to synchronize with the remote target. The default is 10
|
||
characters. Setting the limit to -1 means there's no limit.
|
||
|
||
'show syn-garbage-limit'
|
||
Show the current limit on the number of characters to ignore when
|
||
trying to synchronize with the remote system.
|
||
|
||
'set monitor-prompt PROMPT'
|
||
Tell GDB to expect the specified PROMPT string from the remote
|
||
monitor. The default depends on the target:
|
||
pmon target
|
||
'PMON'
|
||
ddb target
|
||
'NEC010'
|
||
lsi target
|
||
'PMON>'
|
||
|
||
'show monitor-prompt'
|
||
Show the current strings GDB expects as the prompt from the remote
|
||
monitor.
|
||
|
||
'set monitor-warnings'
|
||
Enable or disable monitor warnings about hardware breakpoints.
|
||
This has effect only for the 'lsi' target. When on, GDB will
|
||
display warning messages whose codes are returned by the 'lsi' PMON
|
||
monitor for breakpoint commands.
|
||
|
||
'show monitor-warnings'
|
||
Show the current setting of printing monitor warnings.
|
||
|
||
'pmon COMMAND'
|
||
This command allows sending an arbitrary COMMAND string to the
|
||
monitor. The monitor must be in debug mode for this to work.
|
||
|
||
|
||
File: gdb.info, Node: PowerPC Embedded, Next: PA, Prev: MIPS Embedded, Up: Embedded Processors
|
||
|
||
21.3.6 PowerPC Embedded
|
||
-----------------------
|
||
|
||
GDB supports using the DVC (Data Value Compare) register to implement in
|
||
hardware simple hardware watchpoint conditions of the form:
|
||
|
||
(gdb) watch ADDRESS|VARIABLE \
|
||
if ADDRESS|VARIABLE == CONSTANT EXPRESSION
|
||
|
||
The DVC register will be automatically used when GDB detects such
|
||
pattern in a condition expression, and the created watchpoint uses one
|
||
debug register (either the 'exact-watchpoints' option is on and the
|
||
variable is scalar, or the variable has a length of one byte). This
|
||
feature is available in native GDB running on a Linux kernel version
|
||
2.6.34 or newer.
|
||
|
||
When running on PowerPC embedded processors, GDB automatically uses
|
||
ranged hardware watchpoints, unless the 'exact-watchpoints' option is
|
||
on, in which case watchpoints using only one debug register are created
|
||
when watching variables of scalar types.
|
||
|
||
You can create an artificial array to watch an arbitrary memory
|
||
region using one of the following commands (*note Expressions::):
|
||
|
||
(gdb) watch *((char *) ADDRESS)@LENGTH
|
||
(gdb) watch {char[LENGTH]} ADDRESS
|
||
|
||
PowerPC embedded processors support masked watchpoints. See the
|
||
discussion about the 'mask' argument in *note Set Watchpoints::.
|
||
|
||
PowerPC embedded processors support hardware accelerated "ranged
|
||
breakpoints". A ranged breakpoint stops execution of the inferior
|
||
whenever it executes an instruction at any address within the range it
|
||
specifies. To set a ranged breakpoint in GDB, use the 'break-range'
|
||
command.
|
||
|
||
GDB provides the following PowerPC-specific commands:
|
||
|
||
'break-range START-LOCATION, END-LOCATION'
|
||
Set a breakpoint for an address range given by START-LOCATION and
|
||
END-LOCATION, which can specify a function name, a line number, an
|
||
offset of lines from the current line or from the start location,
|
||
or an address of an instruction (see *note Specify Location::, for
|
||
a list of all the possible ways to specify a LOCATION.) The
|
||
breakpoint will stop execution of the inferior whenever it executes
|
||
an instruction at any address within the specified range,
|
||
(including START-LOCATION and END-LOCATION.)
|
||
|
||
'set powerpc soft-float'
|
||
'show powerpc soft-float'
|
||
Force GDB to use (or not use) a software floating point calling
|
||
convention. By default, GDB selects the calling convention based
|
||
on the selected architecture and the provided executable file.
|
||
|
||
'set powerpc vector-abi'
|
||
'show powerpc vector-abi'
|
||
Force GDB to use the specified calling convention for vector
|
||
arguments and return values. The valid options are 'auto';
|
||
'generic', to avoid vector registers even if they are present;
|
||
'altivec', to use AltiVec registers; and 'spe' to use SPE
|
||
registers. By default, GDB selects the calling convention based on
|
||
the selected architecture and the provided executable file.
|
||
|
||
'set powerpc exact-watchpoints'
|
||
'show powerpc exact-watchpoints'
|
||
Allow GDB to use only one debug register when watching a variable
|
||
of scalar type, thus assuming that the variable is accessed through
|
||
the address of its first byte.
|
||
|
||
'target dink32 DEV'
|
||
DINK32 ROM monitor.
|
||
|
||
'target ppcbug DEV'
|
||
'target ppcbug1 DEV'
|
||
PPCBUG ROM monitor for PowerPC.
|
||
|
||
'target sds DEV'
|
||
SDS monitor, running on a PowerPC board (such as Motorola's ADS).
|
||
|
||
The following commands specific to the SDS protocol are supported by
|
||
GDB:
|
||
|
||
'set sdstimeout NSEC'
|
||
Set the timeout for SDS protocol reads to be NSEC seconds. The
|
||
default is 2 seconds.
|
||
|
||
'show sdstimeout'
|
||
Show the current value of the SDS timeout.
|
||
|
||
'sds COMMAND'
|
||
Send the specified COMMAND string to the SDS monitor.
|
||
|
||
|
||
File: gdb.info, Node: PA, Next: Sparclet, Prev: PowerPC Embedded, Up: Embedded Processors
|
||
|
||
21.3.7 HP PA Embedded
|
||
---------------------
|
||
|
||
'target op50n DEV'
|
||
OP50N monitor, running on an OKI HPPA board.
|
||
|
||
'target w89k DEV'
|
||
W89K monitor, running on a Winbond HPPA board.
|
||
|
||
|
||
File: gdb.info, Node: Sparclet, Next: Sparclite, Prev: PA, Up: Embedded Processors
|
||
|
||
21.3.8 Tsqware Sparclet
|
||
-----------------------
|
||
|
||
GDB enables developers to debug tasks running on Sparclet targets from a
|
||
Unix host. GDB uses code that runs on both the Unix host and on the
|
||
Sparclet target. The program 'gdb' is installed and executed on the
|
||
Unix host.
|
||
|
||
'remotetimeout ARGS'
|
||
GDB supports the option 'remotetimeout'. This option is set by the
|
||
user, and ARGS represents the number of seconds GDB waits for
|
||
responses.
|
||
|
||
When compiling for debugging, include the options '-g' to get debug
|
||
information and '-Ttext' to relocate the program to where you wish to
|
||
load it on the target. You may also want to add the options '-n' or
|
||
'-N' in order to reduce the size of the sections. Example:
|
||
|
||
sparclet-aout-gcc prog.c -Ttext 0x12010000 -g -o prog -N
|
||
|
||
You can use 'objdump' to verify that the addresses are what you
|
||
intended:
|
||
|
||
sparclet-aout-objdump --headers --syms prog
|
||
|
||
Once you have set your Unix execution search path to find GDB, you
|
||
are ready to run GDB. From your Unix host, run 'gdb' (or
|
||
'sparclet-aout-gdb', depending on your installation).
|
||
|
||
GDB comes up showing the prompt:
|
||
|
||
(gdbslet)
|
||
|
||
* Menu:
|
||
|
||
* Sparclet File:: Setting the file to debug
|
||
* Sparclet Connection:: Connecting to Sparclet
|
||
* Sparclet Download:: Sparclet download
|
||
* Sparclet Execution:: Running and debugging
|
||
|
||
|
||
File: gdb.info, Node: Sparclet File, Next: Sparclet Connection, Up: Sparclet
|
||
|
||
21.3.8.1 Setting File to Debug
|
||
..............................
|
||
|
||
The GDB command 'file' lets you choose with program to debug.
|
||
|
||
(gdbslet) file prog
|
||
|
||
GDB then attempts to read the symbol table of 'prog'. GDB locates
|
||
the file by searching the directories listed in the command search path.
|
||
If the file was compiled with debug information (option '-g'), source
|
||
files will be searched as well. GDB locates the source files by
|
||
searching the directories listed in the directory search path (*note
|
||
Your Program's Environment: Environment.). If it fails to find a file,
|
||
it displays a message such as:
|
||
|
||
prog: No such file or directory.
|
||
|
||
When this happens, add the appropriate directories to the search
|
||
paths with the GDB commands 'path' and 'dir', and execute the 'target'
|
||
command again.
|
||
|
||
|
||
File: gdb.info, Node: Sparclet Connection, Next: Sparclet Download, Prev: Sparclet File, Up: Sparclet
|
||
|
||
21.3.8.2 Connecting to Sparclet
|
||
...............................
|
||
|
||
The GDB command 'target' lets you connect to a Sparclet target. To
|
||
connect to a target on serial port "'ttya'", type:
|
||
|
||
(gdbslet) target sparclet /dev/ttya
|
||
Remote target sparclet connected to /dev/ttya
|
||
main () at ../prog.c:3
|
||
|
||
GDB displays messages like these:
|
||
|
||
Connected to ttya.
|
||
|
||
|
||
File: gdb.info, Node: Sparclet Download, Next: Sparclet Execution, Prev: Sparclet Connection, Up: Sparclet
|
||
|
||
21.3.8.3 Sparclet Download
|
||
..........................
|
||
|
||
Once connected to the Sparclet target, you can use the GDB 'load'
|
||
command to download the file from the host to the target. The file name
|
||
and load offset should be given as arguments to the 'load' command.
|
||
Since the file format is aout, the program must be loaded to the
|
||
starting address. You can use 'objdump' to find out what this value is.
|
||
The load offset is an offset which is added to the VMA (virtual memory
|
||
address) of each of the file's sections. For instance, if the program
|
||
'prog' was linked to text address 0x1201000, with data at 0x12010160 and
|
||
bss at 0x12010170, in GDB, type:
|
||
|
||
(gdbslet) load prog 0x12010000
|
||
Loading section .text, size 0xdb0 vma 0x12010000
|
||
|
||
If the code is loaded at a different address then what the program
|
||
was linked to, you may need to use the 'section' and 'add-symbol-file'
|
||
commands to tell GDB where to map the symbol table.
|
||
|
||
|
||
File: gdb.info, Node: Sparclet Execution, Prev: Sparclet Download, Up: Sparclet
|
||
|
||
21.3.8.4 Running and Debugging
|
||
..............................
|
||
|
||
You can now begin debugging the task using GDB's execution control
|
||
commands, 'b', 'step', 'run', etc. See the GDB manual for the list of
|
||
commands.
|
||
|
||
(gdbslet) b main
|
||
Breakpoint 1 at 0x12010000: file prog.c, line 3.
|
||
(gdbslet) run
|
||
Starting program: prog
|
||
Breakpoint 1, main (argc=1, argv=0xeffff21c) at prog.c:3
|
||
3 char *symarg = 0;
|
||
(gdbslet) step
|
||
4 char *execarg = "hello!";
|
||
(gdbslet)
|
||
|
||
|
||
File: gdb.info, Node: Sparclite, Next: Z8000, Prev: Sparclet, Up: Embedded Processors
|
||
|
||
21.3.9 Fujitsu Sparclite
|
||
------------------------
|
||
|
||
'target sparclite DEV'
|
||
Fujitsu sparclite boards, used only for the purpose of loading.
|
||
You must use an additional command to debug the program. For
|
||
example: target remote DEV using GDB standard remote protocol.
|
||
|
||
|
||
File: gdb.info, Node: Z8000, Next: AVR, Prev: Sparclite, Up: Embedded Processors
|
||
|
||
21.3.10 Zilog Z8000
|
||
-------------------
|
||
|
||
When configured for debugging Zilog Z8000 targets, GDB includes a Z8000
|
||
simulator.
|
||
|
||
For the Z8000 family, 'target sim' simulates either the Z8002 (the
|
||
unsegmented variant of the Z8000 architecture) or the Z8001 (the
|
||
segmented variant). The simulator recognizes which architecture is
|
||
appropriate by inspecting the object code.
|
||
|
||
'target sim ARGS'
|
||
Debug programs on a simulated CPU. If the simulator supports setup
|
||
options, specify them via ARGS.
|
||
|
||
After specifying this target, you can debug programs for the simulated
|
||
CPU in the same style as programs for your host computer; use the 'file'
|
||
command to load a new program image, the 'run' command to run your
|
||
program, and so on.
|
||
|
||
As well as making available all the usual machine registers (*note
|
||
Registers: Registers.), the Z8000 simulator provides three additional
|
||
items of information as specially named registers:
|
||
|
||
'cycles'
|
||
Counts clock-ticks in the simulator.
|
||
|
||
'insts'
|
||
Counts instructions run in the simulator.
|
||
|
||
'time'
|
||
Execution time in 60ths of a second.
|
||
|
||
You can refer to these values in GDB expressions with the usual
|
||
conventions; for example, 'b fputc if $cycles>5000' sets a conditional
|
||
breakpoint that suspends only after at least 5000 simulated clock ticks.
|
||
|
||
|
||
File: gdb.info, Node: AVR, Next: CRIS, Prev: Z8000, Up: Embedded Processors
|
||
|
||
21.3.11 Atmel AVR
|
||
-----------------
|
||
|
||
When configured for debugging the Atmel AVR, GDB supports the following
|
||
AVR-specific commands:
|
||
|
||
'info io_registers'
|
||
This command displays information about the AVR I/O registers. For
|
||
each register, GDB prints its number and value.
|
||
|
||
|
||
File: gdb.info, Node: CRIS, Next: Super-H, Prev: AVR, Up: Embedded Processors
|
||
|
||
21.3.12 CRIS
|
||
------------
|
||
|
||
When configured for debugging CRIS, GDB provides the following
|
||
CRIS-specific commands:
|
||
|
||
'set cris-version VER'
|
||
Set the current CRIS version to VER, either '10' or '32'. The CRIS
|
||
version affects register names and sizes. This command is useful
|
||
in case autodetection of the CRIS version fails.
|
||
|
||
'show cris-version'
|
||
Show the current CRIS version.
|
||
|
||
'set cris-dwarf2-cfi'
|
||
Set the usage of DWARF-2 CFI for CRIS debugging. The default is
|
||
'on'. Change to 'off' when using 'gcc-cris' whose version is below
|
||
'R59'.
|
||
|
||
'show cris-dwarf2-cfi'
|
||
Show the current state of using DWARF-2 CFI.
|
||
|
||
'set cris-mode MODE'
|
||
Set the current CRIS mode to MODE. It should only be changed when
|
||
debugging in guru mode, in which case it should be set to 'guru'
|
||
(the default is 'normal').
|
||
|
||
'show cris-mode'
|
||
Show the current CRIS mode.
|
||
|
||
|
||
File: gdb.info, Node: Super-H, Prev: CRIS, Up: Embedded Processors
|
||
|
||
21.3.13 Renesas Super-H
|
||
-----------------------
|
||
|
||
For the Renesas Super-H processor, GDB provides these commands:
|
||
|
||
'set sh calling-convention CONVENTION'
|
||
Set the calling-convention used when calling functions from GDB.
|
||
Allowed values are 'gcc', which is the default setting, and
|
||
'renesas'. With the 'gcc' setting, functions are called using the
|
||
GCC calling convention. If the DWARF-2 information of the called
|
||
function specifies that the function follows the Renesas calling
|
||
convention, the function is called using the Renesas calling
|
||
convention. If the calling convention is set to 'renesas', the
|
||
Renesas calling convention is always used, regardless of the
|
||
DWARF-2 information. This can be used to override the default of
|
||
'gcc' if debug information is missing, or the compiler does not
|
||
emit the DWARF-2 calling convention entry for a function.
|
||
|
||
'show sh calling-convention'
|
||
Show the current calling convention setting.
|
||
|
||
|
||
File: gdb.info, Node: Architectures, Prev: Embedded Processors, Up: Configurations
|
||
|
||
21.4 Architectures
|
||
==================
|
||
|
||
This section describes characteristics of architectures that affect all
|
||
uses of GDB with the architecture, both native and cross.
|
||
|
||
* Menu:
|
||
|
||
* AArch64::
|
||
* i386::
|
||
* Alpha::
|
||
* MIPS::
|
||
* HPPA:: HP PA architecture
|
||
* SPU:: Cell Broadband Engine SPU architecture
|
||
* PowerPC::
|
||
* Nios II::
|
||
|
||
|
||
File: gdb.info, Node: AArch64, Next: i386, Up: Architectures
|
||
|
||
21.4.1 AArch64
|
||
--------------
|
||
|
||
When GDB is debugging the AArch64 architecture, it provides the
|
||
following special commands:
|
||
|
||
'set debug aarch64'
|
||
This command determines whether AArch64 architecture-specific
|
||
debugging messages are to be displayed.
|
||
|
||
'show debug aarch64'
|
||
Show whether AArch64 debugging messages are displayed.
|
||
|
||
|
||
File: gdb.info, Node: i386, Next: Alpha, Prev: AArch64, Up: Architectures
|
||
|
||
21.4.2 x86 Architecture-specific Issues
|
||
---------------------------------------
|
||
|
||
'set struct-convention MODE'
|
||
Set the convention used by the inferior to return 'struct's and
|
||
'union's from functions to MODE. Possible values of MODE are
|
||
'"pcc"', '"reg"', and '"default"' (the default). '"default"' or
|
||
'"pcc"' means that 'struct's are returned on the stack, while
|
||
'"reg"' means that a 'struct' or a 'union' whose size is 1, 2, 4,
|
||
or 8 bytes will be returned in a register.
|
||
|
||
'show struct-convention'
|
||
Show the current setting of the convention to return 'struct's from
|
||
functions.
|
||
|
||
21.4.2.1 Intel(R) "Memory Protection Extensions" (MPX).
|
||
.......................................................
|
||
|
||
Memory Protection Extension (MPX) adds the bound registers 'BND0' (1)
|
||
through 'BND3'. Bound registers store a pair of 64-bit values which are
|
||
the lower bound and upper bound. Bounds are effective addresses or
|
||
memory locations. The upper bounds are architecturally represented in
|
||
1's complement form. A bound having lower bound = 0, and upper bound =
|
||
0 (1's complement of all bits set) will allow access to the entire
|
||
address space.
|
||
|
||
'BND0' through 'BND3' are represented in GDB as 'bnd0raw' through
|
||
'bnd3raw'. Pseudo registers 'bnd0' through 'bnd3' display the upper
|
||
bound performing the complement of one operation on the upper bound
|
||
value, i.e. when upper bound in 'bnd0raw' is 0 in the GDB 'bnd0' it will
|
||
be '0xfff...'. In this sense it can also be noted that the upper bounds
|
||
are inclusive.
|
||
|
||
As an example, assume that the register BND0 holds bounds for a
|
||
pointer having access allowed for the range between 0x32 and 0x71. The
|
||
values present on bnd0raw and bnd registers are presented as follows:
|
||
|
||
bnd0raw = {0x32, 0xffffffff8e}
|
||
bnd0 = {lbound = 0x32, ubound = 0x71} : size 64
|
||
|
||
This way the raw value can be accessed via bnd0raw...bnd3raw. Any
|
||
change on bnd0...bnd3 or bnd0raw...bnd3raw is reflect on its
|
||
counterpart. When the bnd0...bnd3 registers are displayed via Python,
|
||
the display includes the memory size, in bits, accessible to the
|
||
pointer.
|
||
|
||
---------- Footnotes ----------
|
||
|
||
(1) The register named with capital letters represent the
|
||
architecture registers.
|
||
|
||
|
||
File: gdb.info, Node: Alpha, Next: MIPS, Prev: i386, Up: Architectures
|
||
|
||
21.4.3 Alpha
|
||
------------
|
||
|
||
See the following section.
|
||
|
||
|
||
File: gdb.info, Node: MIPS, Next: HPPA, Prev: Alpha, Up: Architectures
|
||
|
||
21.4.4 MIPS
|
||
-----------
|
||
|
||
Alpha- and MIPS-based computers use an unusual stack frame, which
|
||
sometimes requires GDB to search backward in the object code to find the
|
||
beginning of a function.
|
||
|
||
To improve response time (especially for embedded applications, where
|
||
GDB may be restricted to a slow serial line for this search) you may
|
||
want to limit the size of this search, using one of these commands:
|
||
|
||
'set heuristic-fence-post LIMIT'
|
||
Restrict GDB to examining at most LIMIT bytes in its search for the
|
||
beginning of a function. A value of 0 (the default) means there is
|
||
no limit. However, except for 0, the larger the limit the more
|
||
bytes 'heuristic-fence-post' must search and therefore the longer
|
||
it takes to run. You should only need to use this command when
|
||
debugging a stripped executable.
|
||
|
||
'show heuristic-fence-post'
|
||
Display the current limit.
|
||
|
||
These commands are available _only_ when GDB is configured for debugging
|
||
programs on Alpha or MIPS processors.
|
||
|
||
Several MIPS-specific commands are available when debugging MIPS
|
||
programs:
|
||
|
||
'set mips abi ARG'
|
||
Tell GDB which MIPS ABI is used by the inferior. Possible values
|
||
of ARG are:
|
||
|
||
'auto'
|
||
The default ABI associated with the current binary (this is
|
||
the default).
|
||
'o32'
|
||
'o64'
|
||
'n32'
|
||
'n64'
|
||
'eabi32'
|
||
'eabi64'
|
||
|
||
'show mips abi'
|
||
Show the MIPS ABI used by GDB to debug the inferior.
|
||
|
||
'set mips compression ARG'
|
||
Tell GDB which MIPS compressed ISA (Instruction Set Architecture)
|
||
encoding is used by the inferior. GDB uses this for code
|
||
disassembly and other internal interpretation purposes. This
|
||
setting is only referred to when no executable has been associated
|
||
with the debugging session or the executable does not provide
|
||
information about the encoding it uses. Otherwise this setting is
|
||
automatically updated from information provided by the executable.
|
||
|
||
Possible values of ARG are 'mips16' and 'micromips'. The default
|
||
compressed ISA encoding is 'mips16', as executables containing
|
||
MIPS16 code frequently are not identified as such.
|
||
|
||
This setting is "sticky"; that is, it retains its value across
|
||
debugging sessions until reset either explicitly with this command
|
||
or implicitly from an executable.
|
||
|
||
The compiler and/or assembler typically add symbol table
|
||
annotations to identify functions compiled for the MIPS16 or
|
||
microMIPS ISAs. If these function-scope annotations are present,
|
||
GDB uses them in preference to the global compressed ISA encoding
|
||
setting.
|
||
|
||
'show mips compression'
|
||
Show the MIPS compressed ISA encoding used by GDB to debug the
|
||
inferior.
|
||
|
||
'set mipsfpu'
|
||
'show mipsfpu'
|
||
*Note set mipsfpu: MIPS Embedded.
|
||
|
||
'set mips mask-address ARG'
|
||
This command determines whether the most-significant 32 bits of
|
||
64-bit MIPS addresses are masked off. The argument ARG can be
|
||
'on', 'off', or 'auto'. The latter is the default setting, which
|
||
lets GDB determine the correct value.
|
||
|
||
'show mips mask-address'
|
||
Show whether the upper 32 bits of MIPS addresses are masked off or
|
||
not.
|
||
|
||
'set remote-mips64-transfers-32bit-regs'
|
||
This command controls compatibility with 64-bit MIPS targets that
|
||
transfer data in 32-bit quantities. If you have an old MIPS 64
|
||
target that transfers 32 bits for some registers, like SR and FSR,
|
||
and 64 bits for other registers, set this option to 'on'.
|
||
|
||
'show remote-mips64-transfers-32bit-regs'
|
||
Show the current setting of compatibility with older MIPS 64
|
||
targets.
|
||
|
||
'set debug mips'
|
||
This command turns on and off debugging messages for the
|
||
MIPS-specific target code in GDB.
|
||
|
||
'show debug mips'
|
||
Show the current setting of MIPS debugging messages.
|
||
|
||
|
||
File: gdb.info, Node: HPPA, Next: SPU, Prev: MIPS, Up: Architectures
|
||
|
||
21.4.5 HPPA
|
||
-----------
|
||
|
||
When GDB is debugging the HP PA architecture, it provides the following
|
||
special commands:
|
||
|
||
'set debug hppa'
|
||
This command determines whether HPPA architecture-specific
|
||
debugging messages are to be displayed.
|
||
|
||
'show debug hppa'
|
||
Show whether HPPA debugging messages are displayed.
|
||
|
||
'maint print unwind ADDRESS'
|
||
This command displays the contents of the unwind table entry at the
|
||
given ADDRESS.
|
||
|
||
|
||
File: gdb.info, Node: SPU, Next: PowerPC, Prev: HPPA, Up: Architectures
|
||
|
||
21.4.6 Cell Broadband Engine SPU architecture
|
||
---------------------------------------------
|
||
|
||
When GDB is debugging the Cell Broadband Engine SPU architecture, it
|
||
provides the following special commands:
|
||
|
||
'info spu event'
|
||
Display SPU event facility status. Shows current event mask and
|
||
pending event status.
|
||
|
||
'info spu signal'
|
||
Display SPU signal notification facility status. Shows pending
|
||
signal-control word and signal notification mode of both signal
|
||
notification channels.
|
||
|
||
'info spu mailbox'
|
||
Display SPU mailbox facility status. Shows all pending entries, in
|
||
order of processing, in each of the SPU Write Outbound, SPU Write
|
||
Outbound Interrupt, and SPU Read Inbound mailboxes.
|
||
|
||
'info spu dma'
|
||
Display MFC DMA status. Shows all pending commands in the MFC DMA
|
||
queue. For each entry, opcode, tag, class IDs, effective and local
|
||
store addresses and transfer size are shown.
|
||
|
||
'info spu proxydma'
|
||
Display MFC Proxy-DMA status. Shows all pending commands in the
|
||
MFC Proxy-DMA queue. For each entry, opcode, tag, class IDs,
|
||
effective and local store addresses and transfer size are shown.
|
||
|
||
When GDB is debugging a combined PowerPC/SPU application on the Cell
|
||
Broadband Engine, it provides in addition the following special
|
||
commands:
|
||
|
||
'set spu stop-on-load ARG'
|
||
Set whether to stop for new SPE threads. When set to 'on', GDB
|
||
will give control to the user when a new SPE thread enters its
|
||
'main' function. The default is 'off'.
|
||
|
||
'show spu stop-on-load'
|
||
Show whether to stop for new SPE threads.
|
||
|
||
'set spu auto-flush-cache ARG'
|
||
Set whether to automatically flush the software-managed cache.
|
||
When set to 'on', GDB will automatically cause the SPE
|
||
software-managed cache to be flushed whenever SPE execution stops.
|
||
This provides a consistent view of PowerPC memory that is accessed
|
||
via the cache. If an application does not use the software-managed
|
||
cache, this option has no effect.
|
||
|
||
'show spu auto-flush-cache'
|
||
Show whether to automatically flush the software-managed cache.
|
||
|
||
|
||
File: gdb.info, Node: PowerPC, Next: Nios II, Prev: SPU, Up: Architectures
|
||
|
||
21.4.7 PowerPC
|
||
--------------
|
||
|
||
When GDB is debugging the PowerPC architecture, it provides a set of
|
||
pseudo-registers to enable inspection of 128-bit wide Decimal Floating
|
||
Point numbers stored in the floating point registers. These values must
|
||
be stored in two consecutive registers, always starting at an even
|
||
register like 'f0' or 'f2'.
|
||
|
||
The pseudo-registers go from '$dl0' through '$dl15', and are formed
|
||
by joining the even/odd register pairs 'f0' and 'f1' for '$dl0', 'f2'
|
||
and 'f3' for '$dl1' and so on.
|
||
|
||
For POWER7 processors, GDB provides a set of pseudo-registers, the
|
||
64-bit wide Extended Floating Point Registers ('f32' through 'f63').
|
||
|
||
|
||
File: gdb.info, Node: Nios II, Prev: PowerPC, Up: Architectures
|
||
|
||
21.4.8 Nios II
|
||
--------------
|
||
|
||
When GDB is debugging the Nios II architecture, it provides the
|
||
following special commands:
|
||
|
||
'set debug nios2'
|
||
This command turns on and off debugging messages for the Nios II
|
||
target code in GDB.
|
||
|
||
'show debug nios2'
|
||
Show the current setting of Nios II debugging messages.
|
||
|
||
|
||
File: gdb.info, Node: Controlling GDB, Next: Extending GDB, Prev: Configurations, Up: Top
|
||
|
||
22 Controlling GDB
|
||
******************
|
||
|
||
You can alter the way GDB interacts with you by using the 'set' command.
|
||
For commands controlling how GDB displays data, see *note Print
|
||
Settings: Print Settings. Other settings are described here.
|
||
|
||
* Menu:
|
||
|
||
* Prompt:: Prompt
|
||
* Editing:: Command editing
|
||
* Command History:: Command history
|
||
* Screen Size:: Screen size
|
||
* Numbers:: Numbers
|
||
* ABI:: Configuring the current ABI
|
||
* Auto-loading:: Automatically loading associated files
|
||
* Messages/Warnings:: Optional warnings and messages
|
||
* Debugging Output:: Optional messages about internal happenings
|
||
* Other Misc Settings:: Other Miscellaneous Settings
|
||
|
||
|
||
File: gdb.info, Node: Prompt, Next: Editing, Up: Controlling GDB
|
||
|
||
22.1 Prompt
|
||
===========
|
||
|
||
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'
|
||
Directs GDB to use NEWPROMPT as its prompt string henceforth.
|
||
|
||
'show prompt'
|
||
Prints a line of the form: 'Gdb's prompt is: YOUR-PROMPT'
|
||
|
||
Versions of GDB that ship with Python scripting enabled have prompt
|
||
extensions. The commands for interacting with these extensions are:
|
||
|
||
'set extended-prompt PROMPT'
|
||
Set an extended prompt that allows for substitutions. *Note
|
||
gdb.prompt::, for a list of escape sequences that can be used for
|
||
substitution. Any escape sequences specified as part of the prompt
|
||
string are replaced with the corresponding strings each time the
|
||
prompt is displayed.
|
||
|
||
For example:
|
||
|
||
set extended-prompt Current working directory: \w (gdb)
|
||
|
||
Note that when an extended-prompt is set, it takes control of the
|
||
PROMPT_HOOK hook. *Note prompt_hook::, for further information.
|
||
|
||
'show extended-prompt'
|
||
Prints the extended prompt. Any escape sequences specified as part
|
||
of the prompt string with 'set extended-prompt', are replaced with
|
||
the corresponding strings each time the prompt is displayed.
|
||
|
||
|
||
File: gdb.info, Node: Editing, Next: Command History, Prev: Prompt, Up: Controlling GDB
|
||
|
||
22.2 Command Editing
|
||
====================
|
||
|
||
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'
|
||
Enable command line editing (enabled by default).
|
||
|
||
'set editing off'
|
||
Disable command line editing.
|
||
|
||
'show editing'
|
||
Show whether command line editing is enabled.
|
||
|
||
*Note Command Line Editing::, for more details about the Readline
|
||
interface. Users unfamiliar with GNU Emacs or 'vi' are encouraged to
|
||
read that chapter.
|
||
|
||
|
||
File: gdb.info, Node: Command History, Next: Screen Size, Prev: Editing, Up: Controlling GDB
|
||
|
||
22.3 Command History
|
||
====================
|
||
|
||
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.
|
||
|
||
GDB uses the GNU History library, a part of the Readline package, to
|
||
provide the history facility. *Note Using History Interactively::, for
|
||
the detailed description of the History library.
|
||
|
||
To issue a command to GDB without affecting certain aspects of the
|
||
state which is seen by users, prefix it with 'server ' (*note Server
|
||
Prefix::). This means that this command will not affect the command
|
||
history, nor will it affect GDB's notion of which command to repeat if
|
||
<RET> is pressed on a line by itself.
|
||
|
||
The server prefix does not affect the recording of values into the
|
||
value history; to print a value without recording it into the value
|
||
history, use the 'output' command instead of the 'print' command.
|
||
|
||
Here is the description of GDB commands related to command history.
|
||
|
||
'set history filename FNAME'
|
||
Set the name of the GDB command history file to FNAME. This is the
|
||
file where GDB reads an initial command history list, and where it
|
||
writes the command history from this session when it exits. You
|
||
can access this list through history expansion or through the
|
||
history command editing characters listed below. This file
|
||
defaults to the value of the environment variable 'GDBHISTFILE', or
|
||
to './.gdb_history' ('./_gdb_history' on MS-DOS) if this variable
|
||
is not set.
|
||
|
||
'set history save'
|
||
'set history save on'
|
||
Record command history in a file, whose name may be specified with
|
||
the 'set history filename' command. By default, this option is
|
||
disabled.
|
||
|
||
'set history save off'
|
||
Stop recording command history in a file.
|
||
|
||
'set history size SIZE'
|
||
'set history size unlimited'
|
||
Set the number of commands which GDB keeps in its history list.
|
||
This defaults to the value of the environment variable 'HISTSIZE',
|
||
or to 256 if this variable is not set. If SIZE is 'unlimited', the
|
||
number of commands GDB keeps in the history list is unlimited.
|
||
|
||
History expansion assigns special meaning to the character '!'.
|
||
*Note Event Designators::, for more details.
|
||
|
||
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'
|
||
Enable history expansion. History expansion is off by default.
|
||
|
||
'set history expansion off'
|
||
Disable history expansion.
|
||
|
||
'show history'
|
||
'show history filename'
|
||
'show history save'
|
||
'show history size'
|
||
'show history expansion'
|
||
These commands display the state of the GDB history parameters.
|
||
'show history' by itself displays all four states.
|
||
|
||
'show commands'
|
||
Display the last ten commands in the command history.
|
||
|
||
'show commands N'
|
||
Print ten commands centered on command number N.
|
||
|
||
'show commands +'
|
||
Print ten commands just after the commands last printed.
|
||
|
||
|
||
File: gdb.info, Node: Screen Size, Next: Numbers, Prev: Command History, Up: Controlling GDB
|
||
|
||
22.4 Screen Size
|
||
================
|
||
|
||
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'
|
||
'set height unlimited'
|
||
'show height'
|
||
'set width CPL'
|
||
'set width unlimited'
|
||
'show width'
|
||
These '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 either 'unlimited' or 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 unlimited' or 'set width 0' to
|
||
prevent GDB from wrapping its output.
|
||
|
||
'set pagination on'
|
||
'set pagination off'
|
||
Turn the output pagination on or off; the default is on. Turning
|
||
pagination off is the alternative to 'set height unlimited'. Note
|
||
that running GDB with the '--batch' option (*note -batch: Mode
|
||
Options.) also automatically disables pagination.
|
||
|
||
'show pagination'
|
||
Show the current pagination mode.
|
||
|
||
|
||
File: gdb.info, Node: Numbers, Next: ABI, Prev: Screen Size, Up: Controlling GDB
|
||
|
||
22.5 Numbers
|
||
============
|
||
|
||
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 neither
|
||
begin with '0' or '0x', nor end with a '.' 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 commands described below.
|
||
|
||
'set input-radix BASE'
|
||
Set the default base for numeric input. Supported choices for BASE
|
||
are decimal 8, 10, or 16. The base must itself be specified either
|
||
unambiguously or using the current input radix; for example, any of
|
||
|
||
set input-radix 012
|
||
set input-radix 10.
|
||
set input-radix 0xa
|
||
|
||
sets the input base to decimal. On the other hand, 'set
|
||
input-radix 10' leaves the input radix unchanged, no matter what it
|
||
was, since '10', being without any leading or trailing signs of its
|
||
base, is interpreted in the current radix. Thus, if the current
|
||
radix is 16, '10' is interpreted in hex, i.e. as 16 decimal, which
|
||
doesn't change the radix.
|
||
|
||
'set output-radix BASE'
|
||
Set the default base for numeric display. Supported choices for
|
||
BASE are decimal 8, 10, or 16. The base must itself be specified
|
||
either unambiguously or using the current input radix.
|
||
|
||
'show input-radix'
|
||
Display the current default base for numeric input.
|
||
|
||
'show output-radix'
|
||
Display the current default base for numeric display.
|
||
|
||
'set radix [BASE]'
|
||
'show radix'
|
||
These commands set and show the default base for both input and
|
||
output of numbers. 'set radix' sets the radix of input and output
|
||
to the same base; without an argument, it resets the radix back to
|
||
its default value of 10.
|
||
|
||
|
||
File: gdb.info, Node: ABI, Next: Auto-loading, Prev: Numbers, Up: Controlling GDB
|
||
|
||
22.6 Configuring the Current ABI
|
||
================================
|
||
|
||
GDB can determine the "ABI" (Application Binary Interface) of your
|
||
application automatically. However, sometimes you need to override its
|
||
conclusions. Use these commands to manage GDB's view of the current
|
||
ABI.
|
||
|
||
One GDB configuration can debug binaries for multiple operating
|
||
system targets, either via remote debugging or native emulation. GDB
|
||
will autodetect the "OS ABI" (Operating System ABI) in use, but you can
|
||
override its conclusion using the 'set osabi' command. One example
|
||
where this is useful is in debugging of binaries which use an alternate
|
||
C library (e.g. UCLIBC for GNU/Linux) which does not have the same
|
||
identifying marks that the standard C library for your platform
|
||
provides.
|
||
|
||
When GDB is debugging the AArch64 architecture, it provides a
|
||
"Newlib" OS ABI. This is useful for handling 'setjmp' and 'longjmp' when
|
||
debugging binaries that use the NEWLIB C library. The "Newlib" OS ABI
|
||
can be selected by 'set osabi Newlib'.
|
||
|
||
'show osabi'
|
||
Show the OS ABI currently in use.
|
||
|
||
'set osabi'
|
||
With no argument, show the list of registered available OS ABI's.
|
||
|
||
'set osabi ABI'
|
||
Set the current OS ABI to ABI.
|
||
|
||
Generally, the way that an argument of type 'float' is passed to a
|
||
function depends on whether the function is prototyped. For a
|
||
prototyped (i.e. ANSI/ISO style) function, 'float' arguments are passed
|
||
unchanged, according to the architecture's convention for 'float'. For
|
||
unprototyped (i.e. K&R style) functions, 'float' arguments are first
|
||
promoted to type 'double' and then passed.
|
||
|
||
Unfortunately, some forms of debug information do not reliably
|
||
indicate whether a function is prototyped. If GDB calls a function that
|
||
is not marked as prototyped, it consults 'set coerce-float-to-double'.
|
||
|
||
'set coerce-float-to-double'
|
||
'set coerce-float-to-double on'
|
||
Arguments of type 'float' will be promoted to 'double' when passed
|
||
to an unprototyped function. This is the default setting.
|
||
|
||
'set coerce-float-to-double off'
|
||
Arguments of type 'float' will be passed directly to unprototyped
|
||
functions.
|
||
|
||
'show coerce-float-to-double'
|
||
Show the current setting of promoting 'float' to 'double'.
|
||
|
||
GDB needs to know the ABI used for your program's C++ objects. The
|
||
correct C++ ABI depends on which C++ compiler was used to build your
|
||
application. GDB only fully supports programs with a single C++ ABI; if
|
||
your program contains code using multiple C++ ABI's or if GDB can not
|
||
identify your program's ABI correctly, you can tell GDB which ABI to
|
||
use. Currently supported ABI's include "gnu-v2", for 'g++' versions
|
||
before 3.0, "gnu-v3", for 'g++' versions 3.0 and later, and "hpaCC" for
|
||
the HP ANSI C++ compiler. Other C++ compilers may use the "gnu-v2" or
|
||
"gnu-v3" ABI's as well. The default setting is "auto".
|
||
|
||
'show cp-abi'
|
||
Show the C++ ABI currently in use.
|
||
|
||
'set cp-abi'
|
||
With no argument, show the list of supported C++ ABI's.
|
||
|
||
'set cp-abi ABI'
|
||
'set cp-abi auto'
|
||
Set the current C++ ABI to ABI, or return to automatic detection.
|
||
|
||
|
||
File: gdb.info, Node: Auto-loading, Next: Messages/Warnings, Prev: ABI, Up: Controlling GDB
|
||
|
||
22.7 Automatically loading associated files
|
||
===========================================
|
||
|
||
GDB sometimes reads files with commands and settings automatically,
|
||
without being explicitly told so by the user. We call this feature
|
||
"auto-loading". While auto-loading is useful for automatically adapting
|
||
GDB to the needs of your project, it can sometimes produce unexpected
|
||
results or introduce security risks (e.g., if the file comes from
|
||
untrusted sources).
|
||
|
||
* Menu:
|
||
|
||
* Init File in the Current Directory:: 'set/show/info auto-load local-gdbinit'
|
||
* libthread_db.so.1 file:: 'set/show/info auto-load libthread-db'
|
||
|
||
* Auto-loading safe path:: 'set/show/info auto-load safe-path'
|
||
* Auto-loading verbose mode:: 'set/show debug auto-load'
|
||
|
||
There are various kinds of files GDB can automatically load. In
|
||
addition to these files, GDB supports auto-loading code written in
|
||
various extension languages. *Note Auto-loading extensions::.
|
||
|
||
Note that loading of these associated files (including the local
|
||
'.gdbinit' file) requires accordingly configured 'auto-load safe-path'
|
||
(*note Auto-loading safe path::).
|
||
|
||
For these reasons, GDB includes commands and options to let you
|
||
control when to auto-load files and which files should be auto-loaded.
|
||
|
||
'set auto-load off'
|
||
Globally disable loading of all auto-loaded files. You may want to
|
||
use this command with the '-iex' option (*note Option
|
||
-init-eval-command::) such as:
|
||
$ gdb -iex "set auto-load off" untrusted-executable corefile
|
||
|
||
Be aware that system init file (*note System-wide configuration::)
|
||
and init files from your home directory (*note Home Directory Init
|
||
File::) still get read (as they come from generally trusted
|
||
directories). To prevent GDB from auto-loading even those init
|
||
files, use the '-nx' option (*note Mode Options::), in addition to
|
||
'set auto-load no'.
|
||
|
||
'show auto-load'
|
||
Show whether auto-loading of each specific 'auto-load' file(s) is
|
||
enabled or disabled.
|
||
|
||
(gdb) show auto-load
|
||
gdb-scripts: Auto-loading of canned sequences of commands scripts is on.
|
||
libthread-db: Auto-loading of inferior specific libthread_db is on.
|
||
local-gdbinit: Auto-loading of .gdbinit script from current directory
|
||
is on.
|
||
python-scripts: Auto-loading of Python scripts is on.
|
||
safe-path: List of directories from which it is safe to auto-load files
|
||
is $debugdir:$datadir/auto-load.
|
||
scripts-directory: List of directories from which to load auto-loaded scripts
|
||
is $debugdir:$datadir/auto-load.
|
||
|
||
'info auto-load'
|
||
Print whether each specific 'auto-load' file(s) have been
|
||
auto-loaded or not.
|
||
|
||
(gdb) info auto-load
|
||
gdb-scripts:
|
||
Loaded Script
|
||
Yes /home/user/gdb/gdb-gdb.gdb
|
||
libthread-db: No auto-loaded libthread-db.
|
||
local-gdbinit: Local .gdbinit file "/home/user/gdb/.gdbinit" has been
|
||
loaded.
|
||
python-scripts:
|
||
Loaded Script
|
||
Yes /home/user/gdb/gdb-gdb.py
|
||
|
||
These are GDB control commands for the auto-loading:
|
||
|
||
*Note set auto-load off::. Disable auto-loading globally.
|
||
*Note show auto-load::. Show setting of all kinds of
|
||
files.
|
||
*Note info auto-load::. Show state of all kinds of files.
|
||
*Note set auto-load gdb-scripts::. Control for GDB command scripts.
|
||
*Note show auto-load Show setting of GDB command
|
||
gdb-scripts::. scripts.
|
||
*Note info auto-load Show state of GDB command scripts.
|
||
gdb-scripts::.
|
||
*Note set auto-load Control for GDB Python scripts.
|
||
python-scripts::.
|
||
*Note show auto-load Show setting of GDB Python
|
||
python-scripts::. scripts.
|
||
*Note info auto-load Show state of GDB Python scripts.
|
||
python-scripts::.
|
||
*Note set auto-load Control for GDB Guile scripts.
|
||
guile-scripts::.
|
||
*Note show auto-load Show setting of GDB Guile scripts.
|
||
guile-scripts::.
|
||
*Note info auto-load Show state of GDB Guile scripts.
|
||
guile-scripts::.
|
||
*Note set auto-load Control for GDB auto-loaded
|
||
scripts-directory::. scripts location.
|
||
*Note show auto-load Show GDB auto-loaded scripts
|
||
scripts-directory::. location.
|
||
*Note set auto-load Control for init file in the
|
||
local-gdbinit::. current directory.
|
||
*Note show auto-load Show setting of init file in the
|
||
local-gdbinit::. current directory.
|
||
*Note info auto-load Show state of init file in the
|
||
local-gdbinit::. current directory.
|
||
*Note set auto-load Control for thread debugging
|
||
libthread-db::. library.
|
||
*Note show auto-load Show setting of thread debugging
|
||
libthread-db::. library.
|
||
*Note info auto-load Show state of thread debugging
|
||
libthread-db::. library.
|
||
*Note set auto-load safe-path::. Control directories trusted for
|
||
automatic loading.
|
||
*Note show auto-load safe-path::. Show directories trusted for
|
||
automatic loading.
|
||
*Note add-auto-load-safe-path::. Add directory trusted for
|
||
automatic loading.
|
||
|
||
|
||
File: gdb.info, Node: Init File in the Current Directory, Next: libthread_db.so.1 file, Up: Auto-loading
|
||
|
||
22.7.1 Automatically loading init file in the current directory
|
||
---------------------------------------------------------------
|
||
|
||
By default, GDB reads and executes the canned sequences of commands from
|
||
init file (if any) in the current working directory, see *note Init File
|
||
in the Current Directory during Startup::.
|
||
|
||
Note that loading of this local '.gdbinit' file also requires
|
||
accordingly configured 'auto-load safe-path' (*note Auto-loading safe
|
||
path::).
|
||
|
||
'set auto-load local-gdbinit [on|off]'
|
||
Enable or disable the auto-loading of canned sequences of commands
|
||
(*note Sequences::) found in init file in the current directory.
|
||
|
||
'show auto-load local-gdbinit'
|
||
Show whether auto-loading of canned sequences of commands from init
|
||
file in the current directory is enabled or disabled.
|
||
|
||
'info auto-load local-gdbinit'
|
||
Print whether canned sequences of commands from init file in the
|
||
current directory have been auto-loaded.
|
||
|
||
|
||
File: gdb.info, Node: libthread_db.so.1 file, Next: Auto-loading safe path, Prev: Init File in the Current Directory, Up: Auto-loading
|
||
|
||
22.7.2 Automatically loading thread debugging library
|
||
-----------------------------------------------------
|
||
|
||
This feature is currently present only on GNU/Linux native hosts.
|
||
|
||
GDB reads in some cases thread debugging library from places specific
|
||
to the inferior (*note set libthread-db-search-path::).
|
||
|
||
The special 'libthread-db-search-path' entry '$sdir' is processed
|
||
without checking this 'set auto-load libthread-db' switch as system
|
||
libraries have to be trusted in general. In all other cases of
|
||
'libthread-db-search-path' entries GDB checks first if 'set auto-load
|
||
libthread-db' is enabled before trying to open such thread debugging
|
||
library.
|
||
|
||
Note that loading of this debugging library also requires accordingly
|
||
configured 'auto-load safe-path' (*note Auto-loading safe path::).
|
||
|
||
'set auto-load libthread-db [on|off]'
|
||
Enable or disable the auto-loading of inferior specific thread
|
||
debugging library.
|
||
|
||
'show auto-load libthread-db'
|
||
Show whether auto-loading of inferior specific thread debugging
|
||
library is enabled or disabled.
|
||
|
||
'info auto-load libthread-db'
|
||
Print the list of all loaded inferior specific thread debugging
|
||
libraries and for each such library print list of inferior PIDs
|
||
using it.
|
||
|
||
|
||
File: gdb.info, Node: Auto-loading safe path, Next: Auto-loading verbose mode, Prev: libthread_db.so.1 file, Up: Auto-loading
|
||
|
||
22.7.3 Security restriction for auto-loading
|
||
--------------------------------------------
|
||
|
||
As the files of inferior can come from untrusted source (such as
|
||
submitted by an application user) GDB does not always load any files
|
||
automatically. GDB provides the 'set auto-load safe-path' setting to
|
||
list directories trusted for loading files not explicitly requested by
|
||
user. Each directory can also be a shell wildcard pattern.
|
||
|
||
If the path is not set properly you will see a warning and the file
|
||
will not get loaded:
|
||
|
||
$ ./gdb -q ./gdb
|
||
Reading symbols from /home/user/gdb/gdb...done.
|
||
warning: File "/home/user/gdb/gdb-gdb.gdb" auto-loading has been
|
||
declined by your `auto-load safe-path' set
|
||
to "$debugdir:$datadir/auto-load".
|
||
warning: File "/home/user/gdb/gdb-gdb.py" auto-loading has been
|
||
declined by your `auto-load safe-path' set
|
||
to "$debugdir:$datadir/auto-load".
|
||
|
||
To instruct GDB to go ahead and use the init files anyway, invoke GDB
|
||
like this:
|
||
|
||
$ gdb -q -iex "set auto-load safe-path /home/user/gdb" ./gdb
|
||
|
||
The list of trusted directories is controlled by the following
|
||
commands:
|
||
|
||
'set auto-load safe-path [DIRECTORIES]'
|
||
Set the list of directories (and their subdirectories) trusted for
|
||
automatic loading and execution of scripts. You can also enter a
|
||
specific trusted file. Each directory can also be a shell wildcard
|
||
pattern; wildcards do not match directory separator - see
|
||
'FNM_PATHNAME' for system function 'fnmatch' (*note fnmatch:
|
||
(libc)Wildcard Matching.). If you omit DIRECTORIES, 'auto-load
|
||
safe-path' will be reset to its default value as specified during
|
||
GDB compilation.
|
||
|
||
The list of directories uses path separator (':' on GNU and Unix
|
||
systems, ';' on MS-Windows and MS-DOS) to separate directories,
|
||
similarly to the 'PATH' environment variable.
|
||
|
||
'show auto-load safe-path'
|
||
Show the list of directories trusted for automatic loading and
|
||
execution of scripts.
|
||
|
||
'add-auto-load-safe-path'
|
||
Add an entry (or list of entries) the list of directories trusted
|
||
for automatic loading and execution of scripts. Multiple entries
|
||
may be delimited by the host platform path separator in use.
|
||
|
||
This variable defaults to what '--with-auto-load-dir' has been
|
||
configured to (*note with-auto-load-dir::). '$debugdir' and '$datadir'
|
||
substitution applies the same as for *note set auto-load
|
||
scripts-directory::. The default 'set auto-load safe-path' value can be
|
||
also overriden by GDB configuration option '--with-auto-load-safe-path'.
|
||
|
||
Setting this variable to '/' disables this security protection,
|
||
corresponding GDB configuration option is
|
||
'--without-auto-load-safe-path'. This variable is supposed to be set to
|
||
the system directories writable by the system superuser only. Users can
|
||
add their source directories in init files in their home directories
|
||
(*note Home Directory Init File::). See also deprecated init file in
|
||
the current directory (*note Init File in the Current Directory during
|
||
Startup::).
|
||
|
||
To force GDB to load the files it declined to load in the previous
|
||
example, you could use one of the following ways:
|
||
|
||
'~/.gdbinit': 'add-auto-load-safe-path ~/src/gdb'
|
||
Specify this trusted directory (or a file) as additional component
|
||
of the list. You have to specify also any existing directories
|
||
displayed by by 'show auto-load safe-path' (such as '/usr:/bin' in
|
||
this example).
|
||
|
||
'gdb -iex "set auto-load safe-path /usr:/bin:~/src/gdb" ...'
|
||
Specify this directory as in the previous case but just for a
|
||
single GDB session.
|
||
|
||
'gdb -iex "set auto-load safe-path /" ...'
|
||
Disable auto-loading safety for a single GDB session. This assumes
|
||
all the files you debug during this GDB session will come from
|
||
trusted sources.
|
||
|
||
'./configure --without-auto-load-safe-path'
|
||
During compilation of GDB you may disable any auto-loading safety.
|
||
This assumes all the files you will ever debug with this GDB come
|
||
from trusted sources.
|
||
|
||
On the other hand you can also explicitly forbid automatic files
|
||
loading which also suppresses any such warning messages:
|
||
|
||
'gdb -iex "set auto-load no" ...'
|
||
You can use GDB command-line option for a single GDB session.
|
||
|
||
'~/.gdbinit': 'set auto-load no'
|
||
Disable auto-loading globally for the user (*note Home Directory
|
||
Init File::). While it is improbable, you could also use system
|
||
init file instead (*note System-wide configuration::).
|
||
|
||
This setting applies to the file names as entered by user. If no
|
||
entry matches GDB tries as a last resort to also resolve all the file
|
||
names into their canonical form (typically resolving symbolic links) and
|
||
compare the entries again. GDB already canonicalizes most of the
|
||
filenames on its own before starting the comparison so a canonical form
|
||
of directories is recommended to be entered.
|
||
|
||
|
||
File: gdb.info, Node: Auto-loading verbose mode, Prev: Auto-loading safe path, Up: Auto-loading
|
||
|
||
22.7.4 Displaying files tried for auto-load
|
||
-------------------------------------------
|
||
|
||
For better visibility of all the file locations where you can place
|
||
scripts to be auto-loaded with inferior -- or to protect yourself
|
||
against accidental execution of untrusted scripts -- GDB provides a
|
||
feature for printing all the files attempted to be loaded. Both
|
||
existing and non-existing files may be printed.
|
||
|
||
For example the list of directories from which it is safe to
|
||
auto-load files (*note Auto-loading safe path::) applies also to
|
||
canonicalized filenames which may not be too obvious while setting it
|
||
up.
|
||
|
||
(gdb) set debug auto-load on
|
||
(gdb) file ~/src/t/true
|
||
auto-load: Loading canned sequences of commands script "/tmp/true-gdb.gdb"
|
||
for objfile "/tmp/true".
|
||
auto-load: Updating directories of "/usr:/opt".
|
||
auto-load: Using directory "/usr".
|
||
auto-load: Using directory "/opt".
|
||
warning: File "/tmp/true-gdb.gdb" auto-loading has been declined
|
||
by your `auto-load safe-path' set to "/usr:/opt".
|
||
|
||
'set debug auto-load [on|off]'
|
||
Set whether to print the filenames attempted to be auto-loaded.
|
||
|
||
'show debug auto-load'
|
||
Show whether printing of the filenames attempted to be auto-loaded
|
||
is turned on or off.
|
||
|
||
|
||
File: gdb.info, Node: Messages/Warnings, Next: Debugging Output, Prev: Auto-loading, Up: Controlling GDB
|
||
|
||
22.8 Optional Warnings and Messages
|
||
===================================
|
||
|
||
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 *note Commands to Specify Files: Files.
|
||
|
||
'set verbose on'
|
||
Enables GDB output of certain informational messages.
|
||
|
||
'set verbose off'
|
||
Disables GDB output of certain informational messages.
|
||
|
||
'show verbose'
|
||
Displays whether '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 (*note Errors Reading Symbol Files: Symbol
|
||
Errors.).
|
||
|
||
'set complaints LIMIT'
|
||
Permits GDB to output LIMIT complaints about each type of unusual
|
||
symbols before becoming silent about the problem. Set LIMIT to
|
||
zero to suppress all complaints; set it to a large number to
|
||
prevent complaints from being suppressed.
|
||
|
||
'show complaints'
|
||
Displays how many symbol complaints GDB is permitted to produce.
|
||
|
||
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'
|
||
Disables confirmation requests. Note that running GDB with the
|
||
'--batch' option (*note -batch: Mode Options.) also automatically
|
||
disables confirmation requests.
|
||
|
||
'set confirm on'
|
||
Enables confirmation requests (the default).
|
||
|
||
'show confirm'
|
||
Displays state of confirmation requests.
|
||
|
||
If you need to debug user-defined commands or sourced files you may
|
||
find it useful to enable "command tracing". In this mode each command
|
||
will be printed as it is executed, prefixed with one or more '+'
|
||
symbols, the quantity denoting the call depth of each command.
|
||
|
||
'set trace-commands on'
|
||
Enable command tracing.
|
||
'set trace-commands off'
|
||
Disable command tracing.
|
||
'show trace-commands'
|
||
Display the current state of command tracing.
|
||
|
||
|
||
File: gdb.info, Node: Debugging Output, Next: Other Misc Settings, Prev: Messages/Warnings, Up: Controlling GDB
|
||
|
||
22.9 Optional Messages about Internal Happenings
|
||
================================================
|
||
|
||
GDB has commands that enable optional debugging messages from various
|
||
GDB subsystems; normally these commands are of interest to GDB
|
||
maintainers, or when reporting a bug. This section documents those
|
||
commands.
|
||
|
||
'set exec-done-display'
|
||
Turns on or off the notification of asynchronous commands'
|
||
completion. When on, GDB will print a message when an asynchronous
|
||
command finishes its execution. The default is off.
|
||
'show exec-done-display'
|
||
Displays the current setting of asynchronous command completion
|
||
notification.
|
||
'set debug aarch64'
|
||
Turns on or off display of debugging messages related to ARM
|
||
AArch64. The default is off.
|
||
'show debug aarch64'
|
||
Displays the current state of displaying debugging messages related
|
||
to ARM AArch64.
|
||
'set debug arch'
|
||
Turns on or off display of gdbarch debugging info. The default is
|
||
off
|
||
'show debug arch'
|
||
Displays the current state of displaying gdbarch debugging info.
|
||
'set debug aix-solib'
|
||
Control display of debugging messages from the AIX shared library
|
||
support module. The default is off.
|
||
'show debug aix-thread'
|
||
Show the current state of displaying AIX shared library debugging
|
||
messages.
|
||
'set debug aix-thread'
|
||
Display debugging messages about inner workings of the AIX thread
|
||
module.
|
||
'show debug aix-thread'
|
||
Show the current state of AIX thread debugging info display.
|
||
'set debug check-physname'
|
||
Check the results of the "physname" computation. When reading
|
||
DWARF debugging information for C++, GDB attempts to compute each
|
||
entity's name. GDB can do this computation in two different ways,
|
||
depending on exactly what information is present. When enabled,
|
||
this setting causes GDB to compute the names both ways and display
|
||
any discrepancies.
|
||
'show debug check-physname'
|
||
Show the current state of "physname" checking.
|
||
'set debug coff-pe-read'
|
||
Control display of debugging messages related to reading of COFF/PE
|
||
exported symbols. The default is off.
|
||
'show debug coff-pe-read'
|
||
Displays the current state of displaying debugging messages related
|
||
to reading of COFF/PE exported symbols.
|
||
'set debug dwarf2-die'
|
||
Dump DWARF2 DIEs after they are read in. The value is the number
|
||
of nesting levels to print. A value of zero turns off the display.
|
||
'show debug dwarf2-die'
|
||
Show the current state of DWARF2 DIE debugging.
|
||
'set debug dwarf2-read'
|
||
Turns on or off display of debugging messages related to reading
|
||
DWARF debug info. The default is 0 (off). A value of 1 provides
|
||
basic information. A value greater than 1 provides more verbose
|
||
information.
|
||
'show debug dwarf2-read'
|
||
Show the current state of DWARF2 reader debugging.
|
||
'set debug displaced'
|
||
Turns on or off display of GDB debugging info for the displaced
|
||
stepping support. The default is off.
|
||
'show debug displaced'
|
||
Displays the current state of displaying GDB debugging info related
|
||
to displaced stepping.
|
||
'set debug event'
|
||
Turns on or off display of GDB event debugging info. The default
|
||
is off.
|
||
'show debug event'
|
||
Displays the current state of displaying GDB event debugging info.
|
||
'set debug expression'
|
||
Turns on or off display of debugging info about GDB expression
|
||
parsing. The default is off.
|
||
'show debug expression'
|
||
Displays the current state of displaying debugging info about GDB
|
||
expression parsing.
|
||
'set debug frame'
|
||
Turns on or off display of GDB frame debugging info. The default
|
||
is off.
|
||
'show debug frame'
|
||
Displays the current state of displaying GDB frame debugging info.
|
||
'set debug gnu-nat'
|
||
Turns on or off debugging messages from the GNU/Hurd debug support.
|
||
'show debug gnu-nat'
|
||
Show the current state of GNU/Hurd debugging messages.
|
||
'set debug infrun'
|
||
Turns on or off display of GDB debugging info for running the
|
||
inferior. The default is off. 'infrun.c' contains GDB's runtime
|
||
state machine used for implementing operations such as
|
||
single-stepping the inferior.
|
||
'show debug infrun'
|
||
Displays the current state of GDB inferior debugging.
|
||
'set debug jit'
|
||
Turns on or off debugging messages from JIT debug support.
|
||
'show debug jit'
|
||
Displays the current state of GDB JIT debugging.
|
||
'set debug lin-lwp'
|
||
Turns on or off debugging messages from the Linux LWP debug
|
||
support.
|
||
'show debug lin-lwp'
|
||
Show the current state of Linux LWP debugging messages.
|
||
'set debug mach-o'
|
||
Control display of debugging messages related to Mach-O symbols
|
||
processing. The default is off.
|
||
'show debug mach-o'
|
||
Displays the current state of displaying debugging messages related
|
||
to reading of COFF/PE exported symbols.
|
||
'set debug notification'
|
||
Turns on or off debugging messages about remote async notification.
|
||
The default is off.
|
||
'show debug notification'
|
||
Displays the current state of remote async notification debugging
|
||
messages.
|
||
'set debug observer'
|
||
Turns on or off display of GDB observer debugging. This includes
|
||
info such as the notification of observable events.
|
||
'show debug observer'
|
||
Displays the current state of observer debugging.
|
||
'set debug overload'
|
||
Turns on or off display of GDB C++ overload debugging info. This
|
||
includes info such as ranking of functions, etc. The default is
|
||
off.
|
||
'show debug overload'
|
||
Displays the current state of displaying GDB C++ overload debugging
|
||
info.
|
||
'set debug parser'
|
||
Turns on or off the display of expression parser debugging output.
|
||
Internally, this sets the 'yydebug' variable in the expression
|
||
parser. *Note Tracing Your Parser: (bison)Tracing, for details.
|
||
The default is off.
|
||
'show debug parser'
|
||
Show the current state of expression parser debugging.
|
||
'set debug remote'
|
||
Turns on or off display of reports on all packets sent back and
|
||
forth across the serial line to the remote machine. The info is
|
||
printed on the GDB standard output stream. The default is off.
|
||
'show debug remote'
|
||
Displays the state of display of remote packets.
|
||
'set debug serial'
|
||
Turns on or off display of GDB serial debugging info. The default
|
||
is off.
|
||
'show debug serial'
|
||
Displays the current state of displaying GDB serial debugging info.
|
||
'set debug solib-frv'
|
||
Turns on or off debugging messages for FR-V shared-library code.
|
||
'show debug solib-frv'
|
||
Display the current state of FR-V shared-library code debugging
|
||
messages.
|
||
'set debug symfile'
|
||
Turns on or off display of debugging messages related to symbol
|
||
file functions. The default is off. *Note Files::.
|
||
'show debug symfile'
|
||
Show the current state of symbol file debugging messages.
|
||
'set debug symtab-create'
|
||
Turns on or off display of debugging messages related to symbol
|
||
table creation. The default is 0 (off). A value of 1 provides
|
||
basic information. A value greater than 1 provides more verbose
|
||
information.
|
||
'show debug symtab-create'
|
||
Show the current state of symbol table creation debugging.
|
||
'set debug target'
|
||
Turns on or off display of GDB target debugging info. This info
|
||
includes what is going on at the target level of GDB, as it
|
||
happens. The default is 0. Set it to 1 to track events, and to 2
|
||
to also track the value of large memory transfers. Changes to this
|
||
flag do not take effect until the next time you connect to a target
|
||
or use the 'run' command.
|
||
'show debug target'
|
||
Displays the current state of displaying GDB target debugging info.
|
||
'set debug timestamp'
|
||
Turns on or off display of timestamps with GDB debugging info.
|
||
When enabled, seconds and microseconds are displayed before each
|
||
debugging message.
|
||
'show debug timestamp'
|
||
Displays the current state of displaying timestamps with GDB
|
||
debugging info.
|
||
'set debug varobj'
|
||
Turns on or off display of GDB variable object debugging info. The
|
||
default is off.
|
||
'show debug varobj'
|
||
Displays the current state of displaying GDB variable object
|
||
debugging info.
|
||
'set debug xml'
|
||
Turns on or off debugging messages for built-in XML parsers.
|
||
'show debug xml'
|
||
Displays the current state of XML debugging messages.
|
||
|
||
|
||
File: gdb.info, Node: Other Misc Settings, Prev: Debugging Output, Up: Controlling GDB
|
||
|
||
22.10 Other Miscellaneous Settings
|
||
==================================
|
||
|
||
'set interactive-mode'
|
||
If 'on', forces GDB to assume that GDB was started in a terminal.
|
||
In practice, this means that GDB should wait for the user to answer
|
||
queries generated by commands entered at the command prompt. If
|
||
'off', forces GDB to operate in the opposite mode, and it uses the
|
||
default answers to all queries. If 'auto' (the default), GDB tries
|
||
to determine whether its standard input is a terminal, and works in
|
||
interactive-mode if it is, non-interactively otherwise.
|
||
|
||
In the vast majority of cases, the debugger should be able to guess
|
||
correctly which mode should be used. But this setting can be
|
||
useful in certain specific cases, such as running a MinGW GDB
|
||
inside a cygwin window.
|
||
|
||
'show interactive-mode'
|
||
Displays whether the debugger is operating in interactive mode or
|
||
not.
|
||
|
||
|
||
File: gdb.info, Node: Extending GDB, Next: Interpreters, Prev: Controlling GDB, Up: Top
|
||
|
||
23 Extending GDB
|
||
****************
|
||
|
||
GDB provides several mechanisms for extension. GDB also provides the
|
||
ability to automatically load extensions when it reads a file for
|
||
debugging. This allows the user to automatically customize GDB for the
|
||
program being debugged.
|
||
|
||
* Menu:
|
||
|
||
* Sequences:: Canned Sequences of GDB Commands
|
||
* Python:: Extending GDB using Python
|
||
* Guile:: Extending GDB using Guile
|
||
* Auto-loading extensions:: Automatically loading extensions
|
||
* Multiple Extension Languages:: Working with multiple extension languages
|
||
* Aliases:: Creating new spellings of existing commands
|
||
|
||
To facilitate the use of extension languages, GDB is capable of
|
||
evaluating the contents of a file. When doing so, GDB can recognize
|
||
which extension language is being used by looking at the filename
|
||
extension. Files with an unrecognized filename extension are always
|
||
treated as a GDB Command Files. *Note Command files: Command Files.
|
||
|
||
You can control how GDB evaluates these files with the following
|
||
setting:
|
||
|
||
'set script-extension off'
|
||
All scripts are always evaluated as GDB Command Files.
|
||
|
||
'set script-extension soft'
|
||
The debugger determines the scripting language based on filename
|
||
extension. If this scripting language is supported, GDB evaluates
|
||
the script using that language. Otherwise, it evaluates the file
|
||
as a GDB Command File.
|
||
|
||
'set script-extension strict'
|
||
The debugger determines the scripting language based on filename
|
||
extension, and evaluates the script using that language. If the
|
||
language is not supported, then the evaluation fails.
|
||
|
||
'show script-extension'
|
||
Display the current value of the 'script-extension' option.
|
||
|
||
|
||
File: gdb.info, Node: Sequences, Next: Python, Up: Extending GDB
|
||
|
||
23.1 Canned Sequences of Commands
|
||
=================================
|
||
|
||
Aside from breakpoint commands (*note Breakpoint Command Lists: Break
|
||
Commands.), GDB provides two ways to store sequences of commands for
|
||
execution as a unit: user-defined commands and command files.
|
||
|
||
* Menu:
|
||
|
||
* Define:: How to define your own commands
|
||
* Hooks:: Hooks for user-defined commands
|
||
* Command Files:: How to write scripts of commands to be stored in a file
|
||
* Output:: Commands for controlled output
|
||
* Auto-loading sequences:: Controlling auto-loaded command files
|
||
|
||
|
||
File: gdb.info, Node: Define, Next: Hooks, Up: Sequences
|
||
|
||
23.1.1 User-defined Commands
|
||
----------------------------
|
||
|
||
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 whitespace.
|
||
Arguments are accessed within the user command via '$arg0...$arg9'. A
|
||
trivial example:
|
||
|
||
define adder
|
||
print $arg0 + $arg1 + $arg2
|
||
end
|
||
|
||
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.
|
||
|
||
In addition, '$argc' may be used to find out how many arguments have
|
||
been passed. This expands to a number in the range 0...10.
|
||
|
||
define adder
|
||
if $argc == 2
|
||
print $arg0 + $arg1
|
||
end
|
||
if $argc == 3
|
||
print $arg0 + $arg1 + $arg2
|
||
end
|
||
end
|
||
|
||
'define COMMANDNAME'
|
||
Define a command named COMMANDNAME. If there is already a command
|
||
by that name, you are asked to confirm that you want to redefine
|
||
it. The argument COMMANDNAME may be a bare command name consisting
|
||
of letters, numbers, dashes, and underscores. It may also start
|
||
with any predefined prefix command. For example, 'define target
|
||
my-target' creates a user-defined 'target my-target' command.
|
||
|
||
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'.
|
||
|
||
'document COMMANDNAME'
|
||
Document the user-defined command COMMANDNAME, so that it can be
|
||
accessed by '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.
|
||
|
||
'dont-repeat'
|
||
Used inside a user-defined command, this tells GDB that this
|
||
command should not be repeated when the user hits <RET> (*note
|
||
repeat last command: Command Syntax.).
|
||
|
||
'help user-defined'
|
||
List all user-defined commands and all python commands defined in
|
||
class COMAND_USER. The first line of the documentation or docstring
|
||
is included (if any).
|
||
|
||
'show user'
|
||
'show user COMMANDNAME'
|
||
Display the GDB commands used to define COMMANDNAME (but not its
|
||
documentation). If no COMMANDNAME is given, display the
|
||
definitions for all user-defined commands. This does not work for
|
||
user-defined python commands.
|
||
|
||
'show max-user-call-depth'
|
||
'set max-user-call-depth'
|
||
The value of 'max-user-call-depth' controls how many recursion
|
||
levels are allowed in user-defined commands before GDB suspects an
|
||
infinite recursion and aborts the command. This does not apply to
|
||
user-defined python commands.
|
||
|
||
In addition to the above commands, user-defined commands frequently
|
||
use control flow commands, described in *note Command Files::.
|
||
|
||
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.
|
||
|
||
|
||
File: gdb.info, Node: Hooks, Next: Command Files, Prev: Define, Up: Sequences
|
||
|
||
23.1.2 User-defined Command Hooks
|
||
---------------------------------
|
||
|
||
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.
|
||
|
||
A hook may also be defined which is run after the command you
|
||
executed. Whenever you run the command 'foo', if the user-defined
|
||
command 'hookpost-foo' exists, it is executed (with no arguments) after
|
||
that command. Post-execution hooks may exist simultaneously with
|
||
pre-execution hooks, for the same command.
|
||
|
||
It is valid for a hook to call the command which it hooks. If this
|
||
occurs, the hook is not re-executed, thereby avoiding infinite
|
||
recursion.
|
||
|
||
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 SIGALRM pass
|
||
end
|
||
|
||
As a further example, to hook at the beginning and end of the 'echo'
|
||
command, and to add extra text to the beginning and end of the message,
|
||
you could define:
|
||
|
||
define hook-echo
|
||
echo <<<---
|
||
end
|
||
|
||
define hookpost-echo
|
||
echo --->>>\n
|
||
end
|
||
|
||
(gdb) echo Hello World
|
||
<<<---Hello World--->>>
|
||
(gdb)
|
||
|
||
|
||
You 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'. You can hook a multi-word command by
|
||
adding 'hook-' or 'hookpost-' to the last word of the command, e.g.
|
||
'define target hook-remote' to add a hook to 'target remote'.
|
||
|
||
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.
|
||
|
||
|
||
File: gdb.info, Node: Command Files, Next: Output, Prev: Hooks, Up: Sequences
|
||
|
||
23.1.3 Command Files
|
||
--------------------
|
||
|
||
A command file for GDB is a text file made 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.
|
||
|
||
You can request the execution of a command file with the 'source'
|
||
command. Note that the 'source' command is also used to evaluate
|
||
scripts that are not Command Files. The exact behavior can be
|
||
configured using the 'script-extension' setting. *Note Extending GDB:
|
||
Extending GDB.
|
||
|
||
'source [-s] [-v] FILENAME'
|
||
Execute the command file FILENAME.
|
||
|
||
The lines in a command file are generally executed sequentially,
|
||
unless the order of execution is changed by one of the _flow-control
|
||
commands_ described below. The commands are not printed as they are
|
||
executed. An error in any command terminates execution of the command
|
||
file and control is returned to the console.
|
||
|
||
GDB first searches for FILENAME in the current directory. If the
|
||
file is not found there, and FILENAME does not specify a directory, then
|
||
GDB also looks for the file on the source search path (specified with
|
||
the 'directory' command); except that '$cdir' is not searched because
|
||
the compilation directory is not relevant to scripts.
|
||
|
||
If '-s' is specified, then GDB searches for FILENAME on the search
|
||
path even if FILENAME specifies a directory. The search is done by
|
||
appending FILENAME to each element of the search path. So, for example,
|
||
if FILENAME is 'mylib/myscript' and the search path contains
|
||
'/home/user' then GDB will look for the script
|
||
'/home/user/mylib/myscript'. The search is also done if FILENAME is an
|
||
absolute path. For example, if FILENAME is '/tmp/myscript' and the
|
||
search path contains '/home/user' then GDB will look for the script
|
||
'/home/user/tmp/myscript'. For DOS-like systems, if FILENAME contains a
|
||
drive specification, it is stripped before concatenation. For example,
|
||
if FILENAME is 'd:myscript' and the search path contains 'c:/tmp' then
|
||
GDB will look for the script 'c:/tmp/myscript'.
|
||
|
||
If '-v', for verbose mode, is given then GDB displays each command as
|
||
it is executed. The option must be given before FILENAME, and is
|
||
interpreted as part of the filename anywhere else.
|
||
|
||
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.
|
||
|
||
GDB also accepts command input from standard input. In this mode,
|
||
normal output goes to standard output and error output goes to standard
|
||
error. Errors in a command file supplied on standard input do not
|
||
terminate execution of the command file--execution continues with the
|
||
next command.
|
||
|
||
gdb < cmds > log 2>&1
|
||
|
||
(The syntax above will vary depending on the shell used.) This
|
||
example will execute commands from the file 'cmds'. All output and
|
||
errors would be directed to 'log'.
|
||
|
||
Since commands stored on command files tend to be more general than
|
||
commands typed interactively, they frequently need to deal with
|
||
complicated situations, such as different or unexpected values of
|
||
variables and symbols, changes in how the program being debugged is
|
||
built, etc. GDB provides a set of flow-control commands to deal with
|
||
these complexities. Using these commands, you can write complex scripts
|
||
that loop over data structures, execute commands conditionally, etc.
|
||
|
||
'if'
|
||
'else'
|
||
This command allows to include in your script conditionally
|
||
executed commands. The 'if' command takes a single argument, which
|
||
is an expression to evaluate. It is followed by a series of
|
||
commands that are executed only if the expression is true (its
|
||
value is nonzero). There can then optionally be an 'else' line,
|
||
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'
|
||
This command allows to write loops. Its syntax is similar to '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'. These commands are called the "body"
|
||
of the loop. The commands in the body of 'while' are executed
|
||
repeatedly as long as the expression evaluates to true.
|
||
|
||
'loop_break'
|
||
This command exits the 'while' loop in whose body it is included.
|
||
Execution of the script continues after that 'while's 'end' line.
|
||
|
||
'loop_continue'
|
||
This command skips the execution of the rest of the body of
|
||
commands in the 'while' loop in whose body it is included.
|
||
Execution branches to the beginning of the 'while' loop, where it
|
||
evaluates the controlling expression.
|
||
|
||
'end'
|
||
Terminate the block of commands that are the body of 'if', 'else',
|
||
or 'while' flow-control commands.
|
||
|
||
|
||
File: gdb.info, Node: Output, Next: Auto-loading sequences, Prev: Command Files, Up: Sequences
|
||
|
||
23.1.4 Commands for Controlled Output
|
||
-------------------------------------
|
||
|
||
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'
|
||
Print TEXT. Nonprinting characters can be included in TEXT using C
|
||
escape sequences, such as '\n' to print a newline. *No newline is
|
||
printed unless you specify one.* In addition to the standard C
|
||
escape sequences, a backslash followed by a space stands for a
|
||
space. This is useful for displaying a string with spaces at the
|
||
beginning or the end, since leading and trailing spaces are
|
||
otherwise trimmed from all arguments. To print ' and foo = ', use
|
||
the command 'echo \ and foo = \ '.
|
||
|
||
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.\n
|
||
|
||
produces the same output as
|
||
|
||
echo This is some text\n
|
||
echo which is continued\n
|
||
echo onto several lines.\n
|
||
|
||
'output EXPRESSION'
|
||
Print the value of EXPRESSION and nothing but that value: no
|
||
newlines, no '$NN = '. The value is not entered in the value
|
||
history either. *Note Expressions: Expressions, for more
|
||
information on expressions.
|
||
|
||
'output/FMT EXPRESSION'
|
||
Print the value of EXPRESSION in format FMT. You can use the same
|
||
formats as for 'print'. *Note Output Formats: Output Formats, for
|
||
more information.
|
||
|
||
'printf TEMPLATE, EXPRESSIONS...'
|
||
Print the values of one or more EXPRESSIONS under the control of
|
||
the string TEMPLATE. To print several values, make EXPRESSIONS be
|
||
a comma-separated list of individual expressions, which may be
|
||
either numbers or pointers. Their values are printed as specified
|
||
by TEMPLATE, exactly as a C program would do by executing the code
|
||
below:
|
||
|
||
printf (TEMPLATE, EXPRESSIONS...);
|
||
|
||
As in 'C' 'printf', ordinary characters in TEMPLATE are printed
|
||
verbatim, while "conversion specification" introduced by the '%'
|
||
character cause subsequent EXPRESSIONS to be evaluated, their
|
||
values converted and formatted according to type and style
|
||
information encoded in the conversion specifications, and then
|
||
printed.
|
||
|
||
For example, you can print two values in hex like this:
|
||
|
||
printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-foo
|
||
|
||
'printf' supports all the standard 'C' conversion specifications,
|
||
including the flags and modifiers between the '%' character and the
|
||
conversion letter, with the following exceptions:
|
||
|
||
* The argument-ordering modifiers, such as '2$', are not
|
||
supported.
|
||
|
||
* The modifier '*' is not supported for specifying precision or
|
||
width.
|
||
|
||
* The ''' flag (for separation of digits into groups according
|
||
to 'LC_NUMERIC'') is not supported.
|
||
|
||
* The type modifiers 'hh', 'j', 't', and 'z' are not supported.
|
||
|
||
* The conversion letter 'n' (as in '%n') is not supported.
|
||
|
||
* The conversion letters 'a' and 'A' are not supported.
|
||
|
||
Note that the 'll' type modifier is supported only if the
|
||
underlying 'C' implementation used to build GDB supports the 'long
|
||
long int' type, and the 'L' type modifier is supported only if
|
||
'long double' type is available.
|
||
|
||
As in 'C', 'printf' supports simple backslash-escape sequences,
|
||
such as '\n', '\t', '\\', '\"', '\a', and '\f', that consist of
|
||
backslash followed by a single character. Octal and hexadecimal
|
||
escape sequences are not supported.
|
||
|
||
Additionally, 'printf' supports conversion specifications for DFP
|
||
("Decimal Floating Point") types using the following length
|
||
modifiers together with a floating point specifier. letters:
|
||
|
||
* 'H' for printing 'Decimal32' types.
|
||
|
||
* 'D' for printing 'Decimal64' types.
|
||
|
||
* 'DD' for printing 'Decimal128' types.
|
||
|
||
If the underlying 'C' implementation used to build GDB has support
|
||
for the three length modifiers for DFP types, other modifiers such
|
||
as width and precision will also be available for GDB to use.
|
||
|
||
In case there is no such 'C' support, no additional modifiers will
|
||
be available and the value will be printed in the standard way.
|
||
|
||
Here's an example of printing DFP types using the above conversion
|
||
letters:
|
||
printf "D32: %Hf - D64: %Df - D128: %DDf\n",1.2345df,1.2E10dd,1.2E1dl
|
||
|
||
'eval TEMPLATE, EXPRESSIONS...'
|
||
Convert the values of one or more EXPRESSIONS under the control of
|
||
the string TEMPLATE to a command line, and call it.
|
||
|
||
|
||
File: gdb.info, Node: Auto-loading sequences, Prev: Output, Up: Sequences
|
||
|
||
23.1.5 Controlling auto-loading native GDB scripts
|
||
--------------------------------------------------
|
||
|
||
When a new object file is read (for example, due to the 'file' command,
|
||
or because the inferior has loaded a shared library), GDB will look for
|
||
the command file 'OBJFILE-gdb.gdb'. *Note Auto-loading extensions::.
|
||
|
||
Auto-loading can be enabled or disabled, and the list of auto-loaded
|
||
scripts can be printed.
|
||
|
||
'set auto-load gdb-scripts [on|off]'
|
||
Enable or disable the auto-loading of canned sequences of commands
|
||
scripts.
|
||
|
||
'show auto-load gdb-scripts'
|
||
Show whether auto-loading of canned sequences of commands scripts
|
||
is enabled or disabled.
|
||
|
||
'info auto-load gdb-scripts [REGEXP]'
|
||
Print the list of all canned sequences of commands scripts that GDB
|
||
auto-loaded.
|
||
|
||
If REGEXP is supplied only canned sequences of commands scripts with
|
||
matching names are printed.
|
||
|
||
|
||
File: gdb.info, Node: Python, Next: Guile, Prev: Sequences, Up: Extending GDB
|
||
|
||
23.2 Extending GDB using Python
|
||
===============================
|
||
|
||
You can extend GDB using the Python programming language
|
||
(http://www.python.org/). This feature is available only if GDB was
|
||
configured using '--with-python'.
|
||
|
||
Python scripts used by GDB should be installed in
|
||
'DATA-DIRECTORY/python', where DATA-DIRECTORY is the data directory as
|
||
determined at GDB startup (*note Data Files::). This directory, known
|
||
as the "python directory", is automatically added to the Python Search
|
||
Path in order to allow the Python interpreter to locate all scripts
|
||
installed at this location.
|
||
|
||
Additionally, GDB commands and convenience functions which are
|
||
written in Python and are located in the
|
||
'DATA-DIRECTORY/python/gdb/command' or
|
||
'DATA-DIRECTORY/python/gdb/function' directories are automatically
|
||
imported when GDB starts.
|
||
|
||
* Menu:
|
||
|
||
* Python Commands:: Accessing Python from GDB.
|
||
* Python API:: Accessing GDB from Python.
|
||
* Python Auto-loading:: Automatically loading Python code.
|
||
* Python modules:: Python modules provided by GDB.
|
||
|
||
|
||
File: gdb.info, Node: Python Commands, Next: Python API, Up: Python
|
||
|
||
23.2.1 Python Commands
|
||
----------------------
|
||
|
||
GDB provides two commands for accessing the Python interpreter, and one
|
||
related setting:
|
||
|
||
'python-interactive [COMMAND]'
|
||
'pi [COMMAND]'
|
||
Without an argument, the 'python-interactive' command can be used
|
||
to start an interactive Python prompt. To return to GDB, type the
|
||
'EOF' character (e.g., 'Ctrl-D' on an empty prompt).
|
||
|
||
Alternatively, a single-line Python command can be given as an
|
||
argument and evaluated. If the command is an expression, the
|
||
result will be printed; otherwise, nothing will be printed. For
|
||
example:
|
||
|
||
(gdb) python-interactive 2 + 3
|
||
5
|
||
|
||
'python [COMMAND]'
|
||
'py [COMMAND]'
|
||
The 'python' command can be used to evaluate Python code.
|
||
|
||
If given an argument, the 'python' command will evaluate the
|
||
argument as a Python command. For example:
|
||
|
||
(gdb) python print 23
|
||
23
|
||
|
||
If you do not provide an argument to 'python', it will act as a
|
||
multi-line command, like 'define'. In this case, the Python script
|
||
is made up of subsequent command lines, given after the 'python'
|
||
command. This command list is terminated using a line containing
|
||
'end'. For example:
|
||
|
||
(gdb) python
|
||
Type python script
|
||
End with a line saying just "end".
|
||
>print 23
|
||
>end
|
||
23
|
||
|
||
'set python print-stack'
|
||
By default, GDB will print only the message component of a Python
|
||
exception when an error occurs in a Python script. This can be
|
||
controlled using 'set python print-stack': if 'full', then full
|
||
Python stack printing is enabled; if 'none', then Python stack and
|
||
message printing is disabled; if 'message', the default, only the
|
||
message component of the error is printed.
|
||
|
||
It is also possible to execute a Python script from the GDB
|
||
interpreter:
|
||
|
||
'source script-name'
|
||
The script name must end with '.py' and GDB must be configured to
|
||
recognize the script language based on filename extension using the
|
||
'script-extension' setting. *Note Extending GDB: Extending GDB.
|
||
|
||
'python execfile ("script-name")'
|
||
This method is based on the 'execfile' Python built-in function,
|
||
and thus is always available.
|
||
|
||
|
||
File: gdb.info, Node: Python API, Next: Python Auto-loading, Prev: Python Commands, Up: Python
|
||
|
||
23.2.2 Python API
|
||
-----------------
|
||
|
||
You can get quick online help for GDB's Python API by issuing the
|
||
command 'python help (gdb)'.
|
||
|
||
Functions and methods which have two or more optional arguments allow
|
||
them to be specified using keyword syntax. This allows passing some
|
||
optional arguments while skipping others. Example:
|
||
'gdb.some_function ('foo', bar = 1, baz = 2)'.
|
||
|
||
* Menu:
|
||
|
||
* Basic Python:: Basic Python Functions.
|
||
* Exception Handling:: How Python exceptions are translated.
|
||
* Values From Inferior:: Python representation of values.
|
||
* Types In Python:: Python representation of types.
|
||
* Pretty Printing API:: Pretty-printing values.
|
||
* Selecting Pretty-Printers:: How GDB chooses a pretty-printer.
|
||
* Writing a Pretty-Printer:: Writing a Pretty-Printer.
|
||
* Type Printing API:: Pretty-printing types.
|
||
* Frame Filter API:: Filtering Frames.
|
||
* Frame Decorator API:: Decorating Frames.
|
||
* Writing a Frame Filter:: Writing a Frame Filter.
|
||
* Xmethods In Python:: Adding and replacing methods of C++ classes.
|
||
* Xmethod API:: Xmethod types.
|
||
* Writing an Xmethod:: Writing an xmethod.
|
||
* Inferiors In Python:: Python representation of inferiors (processes)
|
||
* Events In Python:: Listening for events from GDB.
|
||
* Threads In Python:: Accessing inferior threads from Python.
|
||
* Commands In Python:: Implementing new commands in Python.
|
||
* Parameters In Python:: Adding new GDB parameters.
|
||
* Functions In Python:: Writing new convenience functions.
|
||
* Progspaces In Python:: Program spaces.
|
||
* Objfiles In Python:: Object files.
|
||
* Frames In Python:: Accessing inferior stack frames from Python.
|
||
* Blocks In Python:: Accessing blocks from Python.
|
||
* Symbols In Python:: Python representation of symbols.
|
||
* Symbol Tables In Python:: Python representation of symbol tables.
|
||
* Line Tables In Python:: Python representation of line tables.
|
||
* Breakpoints In Python:: Manipulating breakpoints using Python.
|
||
* Finish Breakpoints in Python:: Setting Breakpoints on function return
|
||
using Python.
|
||
* Lazy Strings In Python:: Python representation of lazy strings.
|
||
* Architectures In Python:: Python representation of architectures.
|
||
|
||
|
||
File: gdb.info, Node: Basic Python, Next: Exception Handling, Up: Python API
|
||
|
||
23.2.2.1 Basic Python
|
||
.....................
|
||
|
||
At startup, GDB overrides Python's 'sys.stdout' and 'sys.stderr' to
|
||
print using GDB's output-paging streams. A Python program which outputs
|
||
to one of these streams may have its output interrupted by the user
|
||
(*note Screen Size::). In this situation, a Python 'KeyboardInterrupt'
|
||
exception is thrown.
|
||
|
||
Some care must be taken when writing Python code to run in GDB. Two
|
||
things worth noting in particular:
|
||
|
||
* GDB install handlers for 'SIGCHLD' and 'SIGINT'. Python code must
|
||
not override these, or even change the options using 'sigaction'.
|
||
If your program changes the handling of these signals, GDB will
|
||
most likely stop working correctly. Note that it is unfortunately
|
||
common for GUI toolkits to install a 'SIGCHLD' handler.
|
||
|
||
* GDB takes care to mark its internal file descriptors as
|
||
close-on-exec. However, this cannot be done in a thread-safe way
|
||
on all platforms. Your Python programs should be aware of this and
|
||
should both create new file descriptors with the close-on-exec flag
|
||
set and arrange to close unneeded file descriptors before starting
|
||
a child process.
|
||
|
||
GDB introduces a new Python module, named 'gdb'. All methods and
|
||
classes added by GDB are placed in this module. GDB automatically
|
||
'import's the 'gdb' module for use in all scripts evaluated by the
|
||
'python' command.
|
||
|
||
-- Variable: gdb.PYTHONDIR
|
||
A string containing the python directory (*note Python::).
|
||
|
||
-- Function: gdb.execute (command [, from_tty [, to_string]])
|
||
Evaluate COMMAND, a string, as a GDB CLI command. If a GDB
|
||
exception happens while COMMAND runs, it is translated as described
|
||
in *note Exception Handling: Exception Handling.
|
||
|
||
The FROM_TTY flag specifies whether GDB ought to consider this
|
||
command as having originated from the user invoking it
|
||
interactively. It must be a boolean value. If omitted, it
|
||
defaults to 'False'.
|
||
|
||
By default, any output produced by COMMAND is sent to GDB's
|
||
standard output (and to the log output if logging is turned on).
|
||
If the TO_STRING parameter is 'True', then output will be collected
|
||
by 'gdb.execute' and returned as a string. The default is 'False',
|
||
in which case the return value is 'None'. If TO_STRING is 'True',
|
||
the GDB virtual terminal will be temporarily set to unlimited width
|
||
and height, and its pagination will be disabled; *note Screen
|
||
Size::.
|
||
|
||
-- Function: gdb.breakpoints ()
|
||
Return a sequence holding all of GDB's breakpoints. *Note
|
||
Breakpoints In Python::, for more information.
|
||
|
||
-- Function: gdb.parameter (parameter)
|
||
Return the value of a GDB PARAMETER given by its name, a string;
|
||
the parameter name string may contain spaces if the parameter has a
|
||
multi-part name. For example, 'print object' is a valid parameter
|
||
name.
|
||
|
||
If the named parameter does not exist, this function throws a
|
||
'gdb.error' (*note Exception Handling::). Otherwise, the
|
||
parameter's value is converted to a Python value of the appropriate
|
||
type, and returned.
|
||
|
||
-- Function: gdb.history (number)
|
||
Return a value from GDB's value history (*note Value History::).
|
||
The NUMBER argument indicates which history element to return. If
|
||
NUMBER is negative, then GDB will take its absolute value and count
|
||
backward from the last element (i.e., the most recent element) to
|
||
find the value to return. If NUMBER is zero, then GDB will return
|
||
the most recent element. If the element specified by NUMBER
|
||
doesn't exist in the value history, a 'gdb.error' exception will be
|
||
raised.
|
||
|
||
If no exception is raised, the return value is always an instance
|
||
of 'gdb.Value' (*note Values From Inferior::).
|
||
|
||
-- Function: gdb.parse_and_eval (expression)
|
||
Parse EXPRESSION, which must be a string, as an expression in the
|
||
current language, evaluate it, and return the result as a
|
||
'gdb.Value'.
|
||
|
||
This function can be useful when implementing a new command (*note
|
||
Commands In Python::), as it provides a way to parse the command's
|
||
argument as an expression. It is also useful simply to compute
|
||
values, for example, it is the only way to get the value of a
|
||
convenience variable (*note Convenience Vars::) as a 'gdb.Value'.
|
||
|
||
-- Function: gdb.find_pc_line (pc)
|
||
Return the 'gdb.Symtab_and_line' object corresponding to the PC
|
||
value. *Note Symbol Tables In Python::. If an invalid value of PC
|
||
is passed as an argument, then the 'symtab' and 'line' attributes
|
||
of the returned 'gdb.Symtab_and_line' object will be 'None' and 0
|
||
respectively.
|
||
|
||
-- Function: gdb.post_event (event)
|
||
Put EVENT, a callable object taking no arguments, into GDB's
|
||
internal event queue. This callable will be invoked at some later
|
||
point, during GDB's event processing. Events posted using
|
||
'post_event' will be run in the order in which they were posted;
|
||
however, there is no way to know when they will be processed
|
||
relative to other events inside GDB.
|
||
|
||
GDB is not thread-safe. If your Python program uses multiple
|
||
threads, you must be careful to only call GDB-specific functions in
|
||
the GDB thread. 'post_event' ensures this. For example:
|
||
|
||
(gdb) python
|
||
>import threading
|
||
>
|
||
>class Writer():
|
||
> def __init__(self, message):
|
||
> self.message = message;
|
||
> def __call__(self):
|
||
> gdb.write(self.message)
|
||
>
|
||
>class MyThread1 (threading.Thread):
|
||
> def run (self):
|
||
> gdb.post_event(Writer("Hello "))
|
||
>
|
||
>class MyThread2 (threading.Thread):
|
||
> def run (self):
|
||
> gdb.post_event(Writer("World\n"))
|
||
>
|
||
>MyThread1().start()
|
||
>MyThread2().start()
|
||
>end
|
||
(gdb) Hello World
|
||
|
||
-- Function: gdb.write (string [, stream])
|
||
Print a string to GDB's paginated output stream. The optional
|
||
STREAM determines the stream to print to. The default stream is
|
||
GDB's standard output stream. Possible stream values are:
|
||
|
||
'gdb.STDOUT'
|
||
GDB's standard output stream.
|
||
|
||
'gdb.STDERR'
|
||
GDB's standard error stream.
|
||
|
||
'gdb.STDLOG'
|
||
GDB's log stream (*note Logging Output::).
|
||
|
||
Writing to 'sys.stdout' or 'sys.stderr' will automatically call
|
||
this function and will automatically direct the output to the
|
||
relevant stream.
|
||
|
||
-- Function: gdb.flush ()
|
||
Flush the buffer of a GDB paginated stream so that the contents are
|
||
displayed immediately. GDB will flush the contents of a stream
|
||
automatically when it encounters a newline in the buffer. The
|
||
optional STREAM determines the stream to flush. The default stream
|
||
is GDB's standard output stream. Possible stream values are:
|
||
|
||
'gdb.STDOUT'
|
||
GDB's standard output stream.
|
||
|
||
'gdb.STDERR'
|
||
GDB's standard error stream.
|
||
|
||
'gdb.STDLOG'
|
||
GDB's log stream (*note Logging Output::).
|
||
|
||
Flushing 'sys.stdout' or 'sys.stderr' will automatically call this
|
||
function for the relevant stream.
|
||
|
||
-- Function: gdb.target_charset ()
|
||
Return the name of the current target character set (*note
|
||
Character Sets::). This differs from
|
||
'gdb.parameter('target-charset')' in that 'auto' is never returned.
|
||
|
||
-- Function: gdb.target_wide_charset ()
|
||
Return the name of the current target wide character set (*note
|
||
Character Sets::). This differs from
|
||
'gdb.parameter('target-wide-charset')' in that 'auto' is never
|
||
returned.
|
||
|
||
-- Function: gdb.solib_name (address)
|
||
Return the name of the shared library holding the given ADDRESS as
|
||
a string, or 'None'.
|
||
|
||
-- Function: gdb.decode_line [expression]
|
||
Return locations of the line specified by EXPRESSION, or of the
|
||
current line if no argument was given. This function returns a
|
||
Python tuple containing two elements. The first element contains a
|
||
string holding any unparsed section of EXPRESSION (or 'None' if the
|
||
expression has been fully parsed). The second element contains
|
||
either 'None' or another tuple that contains all the locations that
|
||
match the expression represented as 'gdb.Symtab_and_line' objects
|
||
(*note Symbol Tables In Python::). If EXPRESSION is provided, it
|
||
is decoded the way that GDB's inbuilt 'break' or 'edit' commands do
|
||
(*note Specify Location::).
|
||
|
||
-- Function: gdb.prompt_hook (current_prompt)
|
||
|
||
If PROMPT_HOOK is callable, GDB will call the method assigned to
|
||
this operation before a prompt is displayed by GDB.
|
||
|
||
The parameter 'current_prompt' contains the current GDB prompt.
|
||
This method must return a Python string, or 'None'. If a string is
|
||
returned, the GDB prompt will be set to that string. If 'None' is
|
||
returned, GDB will continue to use the current prompt.
|
||
|
||
Some prompts cannot be substituted in GDB. Secondary prompts such
|
||
as those used by readline for command input, and annotation related
|
||
prompts are prohibited from being changed.
|
||
|
||
|
||
File: gdb.info, Node: Exception Handling, Next: Values From Inferior, Prev: Basic Python, Up: Python API
|
||
|
||
23.2.2.2 Exception Handling
|
||
...........................
|
||
|
||
When executing the 'python' command, Python exceptions uncaught within
|
||
the Python code are translated to calls to GDB error-reporting
|
||
mechanism. If the command that called 'python' does not handle the
|
||
error, GDB will terminate it and print an error message containing the
|
||
Python exception name, the associated value, and the Python call stack
|
||
backtrace at the point where the exception was raised. Example:
|
||
|
||
(gdb) python print foo
|
||
Traceback (most recent call last):
|
||
File "<string>", line 1, in <module>
|
||
NameError: name 'foo' is not defined
|
||
|
||
GDB errors that happen in GDB commands invoked by Python code are
|
||
converted to Python exceptions. The type of the Python exception
|
||
depends on the error.
|
||
|
||
'gdb.error'
|
||
This is the base class for most exceptions generated by GDB. It is
|
||
derived from 'RuntimeError', for compatibility with earlier
|
||
versions of GDB.
|
||
|
||
If an error occurring in GDB does not fit into some more specific
|
||
category, then the generated exception will have this type.
|
||
|
||
'gdb.MemoryError'
|
||
This is a subclass of 'gdb.error' which is thrown when an operation
|
||
tried to access invalid memory in the inferior.
|
||
|
||
'KeyboardInterrupt'
|
||
User interrupt (via 'C-c' or by typing 'q' at a pagination prompt)
|
||
is translated to a Python 'KeyboardInterrupt' exception.
|
||
|
||
In all cases, your exception handler will see the GDB error message
|
||
as its value and the Python call stack backtrace at the Python statement
|
||
closest to where the GDB error occured as the traceback.
|
||
|
||
When implementing GDB commands in Python via 'gdb.Command', it is
|
||
useful to be able to throw an exception that doesn't cause a traceback
|
||
to be printed. For example, the user may have invoked the command
|
||
incorrectly. Use the 'gdb.GdbError' exception to handle this case.
|
||
Example:
|
||
|
||
(gdb) python
|
||
>class HelloWorld (gdb.Command):
|
||
> """Greet the whole world."""
|
||
> def __init__ (self):
|
||
> super (HelloWorld, self).__init__ ("hello-world", gdb.COMMAND_USER)
|
||
> def invoke (self, args, from_tty):
|
||
> argv = gdb.string_to_argv (args)
|
||
> if len (argv) != 0:
|
||
> raise gdb.GdbError ("hello-world takes no arguments")
|
||
> print "Hello, World!"
|
||
>HelloWorld ()
|
||
>end
|
||
(gdb) hello-world 42
|
||
hello-world takes no arguments
|
||
|
||
|
||
File: gdb.info, Node: Values From Inferior, Next: Types In Python, Prev: Exception Handling, Up: Python API
|
||
|
||
23.2.2.3 Values From Inferior
|
||
.............................
|
||
|
||
GDB provides values it obtains from the inferior program in an object of
|
||
type 'gdb.Value'. GDB uses this object for its internal bookkeeping of
|
||
the inferior's values, and for fetching values when necessary.
|
||
|
||
Inferior values that are simple scalars can be used directly in
|
||
Python expressions that are valid for the value's data type. Here's an
|
||
example for an integer or floating-point value 'some_val':
|
||
|
||
bar = some_val + 2
|
||
|
||
As result of this, 'bar' will also be a 'gdb.Value' object whose values
|
||
are of the same type as those of 'some_val'. Valid Python operations
|
||
can also be performed on 'gdb.Value' objects representing a 'struct' or
|
||
'class' object. For such cases, the overloaded operator (if present),
|
||
is used to perform the operation. For example, if 'val1' and 'val2' are
|
||
'gdb.Value' objects representing instances of a 'class' which overloads
|
||
the '+' operator, then one can use the '+' operator in their Python
|
||
script as follows:
|
||
|
||
val3 = val1 + val2
|
||
|
||
The result of the operation 'val3' is also a 'gdb.Value' object
|
||
corresponding to the value returned by the overloaded '+' operator. In
|
||
general, overloaded operators are invoked for the following operations:
|
||
'+' (binary addition), '-' (binary subtraction), '*' (multiplication),
|
||
'/', '%', '<<', '>>', '|', '&', '^'.
|
||
|
||
Inferior values that are structures or instances of some class can be
|
||
accessed using the Python "dictionary syntax". For example, if
|
||
'some_val' is a 'gdb.Value' instance holding a structure, you can access
|
||
its 'foo' element with:
|
||
|
||
bar = some_val['foo']
|
||
|
||
Again, 'bar' will also be a 'gdb.Value' object. Structure elements
|
||
can also be accessed by using 'gdb.Field' objects as subscripts (*note
|
||
Types In Python::, for more information on 'gdb.Field' objects). For
|
||
example, if 'foo_field' is a 'gdb.Field' object corresponding to element
|
||
'foo' of the above structure, then 'bar' can also be accessed as
|
||
follows:
|
||
|
||
bar = some_val[foo_field]
|
||
|
||
A 'gdb.Value' that represents a function can be executed via inferior
|
||
function call. Any arguments provided to the call must match the
|
||
function's prototype, and must be provided in the order specified by
|
||
that prototype.
|
||
|
||
For example, 'some_val' is a 'gdb.Value' instance representing a
|
||
function that takes two integers as arguments. To execute this
|
||
function, call it like so:
|
||
|
||
result = some_val (10,20)
|
||
|
||
Any values returned from a function call will be stored as a
|
||
'gdb.Value'.
|
||
|
||
The following attributes are provided:
|
||
|
||
-- Variable: Value.address
|
||
If this object is addressable, this read-only attribute holds a
|
||
'gdb.Value' object representing the address. Otherwise, this
|
||
attribute holds 'None'.
|
||
|
||
-- Variable: Value.is_optimized_out
|
||
This read-only boolean attribute is true if the compiler optimized
|
||
out this value, thus it is not available for fetching from the
|
||
inferior.
|
||
|
||
-- Variable: Value.type
|
||
The type of this 'gdb.Value'. The value of this attribute is a
|
||
'gdb.Type' object (*note Types In Python::).
|
||
|
||
-- Variable: Value.dynamic_type
|
||
The dynamic type of this 'gdb.Value'. This uses C++ run-time type
|
||
information (RTTI) to determine the dynamic type of the value. If
|
||
this value is of class type, it will return the class in which the
|
||
value is embedded, if any. If this value is of pointer or
|
||
reference to a class type, it will compute the dynamic type of the
|
||
referenced object, and return a pointer or reference to that type,
|
||
respectively. In all other cases, it will return the value's
|
||
static type.
|
||
|
||
Note that this feature will only work when debugging a C++ program
|
||
that includes RTTI for the object in question. Otherwise, it will
|
||
just return the static type of the value as in 'ptype foo' (*note
|
||
ptype: Symbols.).
|
||
|
||
-- Variable: Value.is_lazy
|
||
The value of this read-only boolean attribute is 'True' if this
|
||
'gdb.Value' has not yet been fetched from the inferior. GDB does
|
||
not fetch values until necessary, for efficiency. For example:
|
||
|
||
myval = gdb.parse_and_eval ('somevar')
|
||
|
||
The value of 'somevar' is not fetched at this time. It will be
|
||
fetched when the value is needed, or when the 'fetch_lazy' method
|
||
is invoked.
|
||
|
||
The following methods are provided:
|
||
|
||
-- Function: Value.__init__ (VAL)
|
||
Many Python values can be converted directly to a 'gdb.Value' via
|
||
this object initializer. Specifically:
|
||
|
||
Python boolean
|
||
A Python boolean is converted to the boolean type from the
|
||
current language.
|
||
|
||
Python integer
|
||
A Python integer is converted to the C 'long' type for the
|
||
current architecture.
|
||
|
||
Python long
|
||
A Python long is converted to the C 'long long' type for the
|
||
current architecture.
|
||
|
||
Python float
|
||
A Python float is converted to the C 'double' type for the
|
||
current architecture.
|
||
|
||
Python string
|
||
A Python string is converted to a target string in the current
|
||
target language using the current target encoding. If a
|
||
character cannot be represented in the current target
|
||
encoding, then an exception is thrown.
|
||
|
||
'gdb.Value'
|
||
If 'val' is a 'gdb.Value', then a copy of the value is made.
|
||
|
||
'gdb.LazyString'
|
||
If 'val' is a 'gdb.LazyString' (*note Lazy Strings In
|
||
Python::), then the lazy string's 'value' method is called,
|
||
and its result is used.
|
||
|
||
-- Function: Value.cast (type)
|
||
Return a new instance of 'gdb.Value' that is the result of casting
|
||
this instance to the type described by TYPE, which must be a
|
||
'gdb.Type' object. If the cast cannot be performed for some
|
||
reason, this method throws an exception.
|
||
|
||
-- Function: Value.dereference ()
|
||
For pointer data types, this method returns a new 'gdb.Value'
|
||
object whose contents is the object pointed to by the pointer. For
|
||
example, if 'foo' is a C pointer to an 'int', declared in your C
|
||
program as
|
||
|
||
int *foo;
|
||
|
||
then you can use the corresponding 'gdb.Value' to access what 'foo'
|
||
points to like this:
|
||
|
||
bar = foo.dereference ()
|
||
|
||
The result 'bar' will be a 'gdb.Value' object holding the value
|
||
pointed to by 'foo'.
|
||
|
||
A similar function 'Value.referenced_value' exists which also
|
||
returns 'gdb.Value' objects corresonding to the values pointed to
|
||
by pointer values (and additionally, values referenced by reference
|
||
values). However, the behavior of 'Value.dereference' differs from
|
||
'Value.referenced_value' by the fact that the behavior of
|
||
'Value.dereference' is identical to applying the C unary operator
|
||
'*' on a given value. For example, consider a reference to a
|
||
pointer 'ptrref', declared in your C++ program as
|
||
|
||
typedef int *intptr;
|
||
...
|
||
int val = 10;
|
||
intptr ptr = &val;
|
||
intptr &ptrref = ptr;
|
||
|
||
Though 'ptrref' is a reference value, one can apply the method
|
||
'Value.dereference' to the 'gdb.Value' object corresponding to it
|
||
and obtain a 'gdb.Value' which is identical to that corresponding
|
||
to 'val'. However, if you apply the method
|
||
'Value.referenced_value', the result would be a 'gdb.Value' object
|
||
identical to that corresponding to 'ptr'.
|
||
|
||
py_ptrref = gdb.parse_and_eval ("ptrref")
|
||
py_val = py_ptrref.dereference ()
|
||
py_ptr = py_ptrref.referenced_value ()
|
||
|
||
The 'gdb.Value' object 'py_val' is identical to that corresponding
|
||
to 'val', and 'py_ptr' is identical to that corresponding to 'ptr'.
|
||
In general, 'Value.dereference' can be applied whenever the C unary
|
||
operator '*' can be applied to the corresponding C value. For
|
||
those cases where applying both 'Value.dereference' and
|
||
'Value.referenced_value' is allowed, the results obtained need not
|
||
be identical (as we have seen in the above example). The results
|
||
are however identical when applied on 'gdb.Value' objects
|
||
corresponding to pointers ('gdb.Value' objects with type code
|
||
'TYPE_CODE_PTR') in a C/C++ program.
|
||
|
||
-- Function: Value.referenced_value ()
|
||
For pointer or reference data types, this method returns a new
|
||
'gdb.Value' object corresponding to the value referenced by the
|
||
pointer/reference value. For pointer data types,
|
||
'Value.dereference' and 'Value.referenced_value' produce identical
|
||
results. The difference between these methods is that
|
||
'Value.dereference' cannot get the values referenced by reference
|
||
values. For example, consider a reference to an 'int', declared in
|
||
your C++ program as
|
||
|
||
int val = 10;
|
||
int &ref = val;
|
||
|
||
then applying 'Value.dereference' to the 'gdb.Value' object
|
||
corresponding to 'ref' will result in an error, while applying
|
||
'Value.referenced_value' will result in a 'gdb.Value' object
|
||
identical to that corresponding to 'val'.
|
||
|
||
py_ref = gdb.parse_and_eval ("ref")
|
||
er_ref = py_ref.dereference () # Results in error
|
||
py_val = py_ref.referenced_value () # Returns the referenced value
|
||
|
||
The 'gdb.Value' object 'py_val' is identical to that corresponding
|
||
to 'val'.
|
||
|
||
-- Function: Value.dynamic_cast (type)
|
||
Like 'Value.cast', but works as if the C++ 'dynamic_cast' operator
|
||
were used. Consult a C++ reference for details.
|
||
|
||
-- Function: Value.reinterpret_cast (type)
|
||
Like 'Value.cast', but works as if the C++ 'reinterpret_cast'
|
||
operator were used. Consult a C++ reference for details.
|
||
|
||
-- Function: Value.string ([encoding[, errors[, length]]])
|
||
If this 'gdb.Value' represents a string, then this method converts
|
||
the contents to a Python string. Otherwise, this method will throw
|
||
an exception.
|
||
|
||
Values are interpreted as strings according to the rules of the
|
||
current language. If the optional length argument is given, the
|
||
string will be converted to that length, and will include any
|
||
embedded zeroes that the string may contain. Otherwise, for
|
||
languages where the string is zero-terminated, the entire string
|
||
will be converted.
|
||
|
||
For example, in C-like languages, a value is a string if it is a
|
||
pointer to or an array of characters or ints of type 'wchar_t',
|
||
'char16_t', or 'char32_t'.
|
||
|
||
If the optional ENCODING argument is given, it must be a string
|
||
naming the encoding of the string in the 'gdb.Value', such as
|
||
'"ascii"', '"iso-8859-6"' or '"utf-8"'. It accepts the same
|
||
encodings as the corresponding argument to Python's 'string.decode'
|
||
method, and the Python codec machinery will be used to convert the
|
||
string. If ENCODING is not given, or if ENCODING is the empty
|
||
string, then either the 'target-charset' (*note Character Sets::)
|
||
will be used, or a language-specific encoding will be used, if the
|
||
current language is able to supply one.
|
||
|
||
The optional ERRORS argument is the same as the corresponding
|
||
argument to Python's 'string.decode' method.
|
||
|
||
If the optional LENGTH argument is given, the string will be
|
||
fetched and converted to the given length.
|
||
|
||
-- Function: Value.lazy_string ([encoding [, length]])
|
||
If this 'gdb.Value' represents a string, then this method converts
|
||
the contents to a 'gdb.LazyString' (*note Lazy Strings In
|
||
Python::). Otherwise, this method will throw an exception.
|
||
|
||
If the optional ENCODING argument is given, it must be a string
|
||
naming the encoding of the 'gdb.LazyString'. Some examples are:
|
||
'ascii', 'iso-8859-6' or 'utf-8'. If the ENCODING argument is an
|
||
encoding that GDB does recognize, GDB will raise an error.
|
||
|
||
When a lazy string is printed, the GDB encoding machinery is used
|
||
to convert the string during printing. If the optional ENCODING
|
||
argument is not provided, or is an empty string, GDB will
|
||
automatically select the encoding most suitable for the string
|
||
type. For further information on encoding in GDB please see *note
|
||
Character Sets::.
|
||
|
||
If the optional LENGTH argument is given, the string will be
|
||
fetched and encoded to the length of characters specified. If the
|
||
LENGTH argument is not provided, the string will be fetched and
|
||
encoded until a null of appropriate width is found.
|
||
|
||
-- Function: Value.fetch_lazy ()
|
||
If the 'gdb.Value' object is currently a lazy value
|
||
('gdb.Value.is_lazy' is 'True'), then the value is fetched from the
|
||
inferior. Any errors that occur in the process will produce a
|
||
Python exception.
|
||
|
||
If the 'gdb.Value' object is not a lazy value, this method has no
|
||
effect.
|
||
|
||
This method does not return a value.
|
||
|
||
|
||
File: gdb.info, Node: Types In Python, Next: Pretty Printing API, Prev: Values From Inferior, Up: Python API
|
||
|
||
23.2.2.4 Types In Python
|
||
........................
|
||
|
||
GDB represents types from the inferior using the class 'gdb.Type'.
|
||
|
||
The following type-related functions are available in the 'gdb'
|
||
module:
|
||
|
||
-- Function: gdb.lookup_type (name [, block])
|
||
This function looks up a type by its NAME, which must be a string.
|
||
|
||
If BLOCK is given, then NAME is looked up in that scope.
|
||
Otherwise, it is searched for globally.
|
||
|
||
Ordinarily, this function will return an instance of 'gdb.Type'.
|
||
If the named type cannot be found, it will throw an exception.
|
||
|
||
If the type is a structure or class type, or an enum type, the fields
|
||
of that type can be accessed using the Python "dictionary syntax". For
|
||
example, if 'some_type' is a 'gdb.Type' instance holding a structure
|
||
type, you can access its 'foo' field with:
|
||
|
||
bar = some_type['foo']
|
||
|
||
'bar' will be a 'gdb.Field' object; see below under the description
|
||
of the 'Type.fields' method for a description of the 'gdb.Field' class.
|
||
|
||
An instance of 'Type' has the following attributes:
|
||
|
||
-- Variable: Type.code
|
||
The type code for this type. The type code will be one of the
|
||
'TYPE_CODE_' constants defined below.
|
||
|
||
-- Variable: Type.name
|
||
The name of this type. If this type has no name, then 'None' is
|
||
returned.
|
||
|
||
-- Variable: Type.sizeof
|
||
The size of this type, in target 'char' units. Usually, a target's
|
||
'char' type will be an 8-bit byte. However, on some unusual
|
||
platforms, this type may have a different size.
|
||
|
||
-- Variable: Type.tag
|
||
The tag name for this type. The tag name is the name after
|
||
'struct', 'union', or 'enum' in C and C++; not all languages have
|
||
this concept. If this type has no tag name, then 'None' is
|
||
returned.
|
||
|
||
The following methods are provided:
|
||
|
||
-- Function: Type.fields ()
|
||
For structure and union types, this method returns the fields.
|
||
Range types have two fields, the minimum and maximum values. Enum
|
||
types have one field per enum constant. Function and method types
|
||
have one field per parameter. The base types of C++ classes are
|
||
also represented as fields. If the type has no fields, or does not
|
||
fit into one of these categories, an empty sequence will be
|
||
returned.
|
||
|
||
Each field is a 'gdb.Field' object, with some pre-defined
|
||
attributes:
|
||
'bitpos'
|
||
This attribute is not available for 'enum' or 'static' (as in
|
||
C++ or Java) fields. The value is the position, counting in
|
||
bits, from the start of the containing type.
|
||
|
||
'enumval'
|
||
This attribute is only available for 'enum' fields, and its
|
||
value is the enumeration member's integer representation.
|
||
|
||
'name'
|
||
The name of the field, or 'None' for anonymous fields.
|
||
|
||
'artificial'
|
||
This is 'True' if the field is artificial, usually meaning
|
||
that it was provided by the compiler and not the user. This
|
||
attribute is always provided, and is 'False' if the field is
|
||
not artificial.
|
||
|
||
'is_base_class'
|
||
This is 'True' if the field represents a base class of a C++
|
||
structure. This attribute is always provided, and is 'False'
|
||
if the field is not a base class of the type that is the
|
||
argument of 'fields', or if that type was not a C++ class.
|
||
|
||
'bitsize'
|
||
If the field is packed, or is a bitfield, then this will have
|
||
a non-zero value, which is the size of the field in bits.
|
||
Otherwise, this will be zero; in this case the field's size is
|
||
given by its type.
|
||
|
||
'type'
|
||
The type of the field. This is usually an instance of 'Type',
|
||
but it can be 'None' in some situations.
|
||
|
||
'parent_type'
|
||
The type which contains this field. This is an instance of
|
||
'gdb.Type'.
|
||
|
||
-- Function: Type.array (N1 [, N2])
|
||
Return a new 'gdb.Type' object which represents an array of this
|
||
type. If one argument is given, it is the inclusive upper bound of
|
||
the array; in this case the lower bound is zero. If two arguments
|
||
are given, the first argument is the lower bound of the array, and
|
||
the second argument is the upper bound of the array. An array's
|
||
length must not be negative, but the bounds can be.
|
||
|
||
-- Function: Type.vector (N1 [, N2])
|
||
Return a new 'gdb.Type' object which represents a vector of this
|
||
type. If one argument is given, it is the inclusive upper bound of
|
||
the vector; in this case the lower bound is zero. If two arguments
|
||
are given, the first argument is the lower bound of the vector, and
|
||
the second argument is the upper bound of the vector. A vector's
|
||
length must not be negative, but the bounds can be.
|
||
|
||
The difference between an 'array' and a 'vector' is that arrays
|
||
behave like in C: when used in expressions they decay to a pointer
|
||
to the first element whereas vectors are treated as first class
|
||
values.
|
||
|
||
-- Function: Type.const ()
|
||
Return a new 'gdb.Type' object which represents a 'const'-qualified
|
||
variant of this type.
|
||
|
||
-- Function: Type.volatile ()
|
||
Return a new 'gdb.Type' object which represents a
|
||
'volatile'-qualified variant of this type.
|
||
|
||
-- Function: Type.unqualified ()
|
||
Return a new 'gdb.Type' object which represents an unqualified
|
||
variant of this type. That is, the result is neither 'const' nor
|
||
'volatile'.
|
||
|
||
-- Function: Type.range ()
|
||
Return a Python 'Tuple' object that contains two elements: the low
|
||
bound of the argument type and the high bound of that type. If the
|
||
type does not have a range, GDB will raise a 'gdb.error' exception
|
||
(*note Exception Handling::).
|
||
|
||
-- Function: Type.reference ()
|
||
Return a new 'gdb.Type' object which represents a reference to this
|
||
type.
|
||
|
||
-- Function: Type.pointer ()
|
||
Return a new 'gdb.Type' object which represents a pointer to this
|
||
type.
|
||
|
||
-- Function: Type.strip_typedefs ()
|
||
Return a new 'gdb.Type' that represents the real type, after
|
||
removing all layers of typedefs.
|
||
|
||
-- Function: Type.target ()
|
||
Return a new 'gdb.Type' object which represents the target type of
|
||
this type.
|
||
|
||
For a pointer type, the target type is the type of the pointed-to
|
||
object. For an array type (meaning C-like arrays), the target type
|
||
is the type of the elements of the array. For a function or method
|
||
type, the target type is the type of the return value. For a
|
||
complex type, the target type is the type of the elements. For a
|
||
typedef, the target type is the aliased type.
|
||
|
||
If the type does not have a target, this method will throw an
|
||
exception.
|
||
|
||
-- Function: Type.template_argument (n [, block])
|
||
If this 'gdb.Type' is an instantiation of a template, this will
|
||
return a new 'gdb.Type' which represents the type of the Nth
|
||
template argument.
|
||
|
||
If this 'gdb.Type' is not a template type, this will throw an
|
||
exception. Ordinarily, only C++ code will have template types.
|
||
|
||
If BLOCK is given, then NAME is looked up in that scope.
|
||
Otherwise, it is searched for globally.
|
||
|
||
Each type has a code, which indicates what category this type falls
|
||
into. The available type categories are represented by constants
|
||
defined in the 'gdb' module:
|
||
|
||
'gdb.TYPE_CODE_PTR'
|
||
The type is a pointer.
|
||
|
||
'gdb.TYPE_CODE_ARRAY'
|
||
The type is an array.
|
||
|
||
'gdb.TYPE_CODE_STRUCT'
|
||
The type is a structure.
|
||
|
||
'gdb.TYPE_CODE_UNION'
|
||
The type is a union.
|
||
|
||
'gdb.TYPE_CODE_ENUM'
|
||
The type is an enum.
|
||
|
||
'gdb.TYPE_CODE_FLAGS'
|
||
A bit flags type, used for things such as status registers.
|
||
|
||
'gdb.TYPE_CODE_FUNC'
|
||
The type is a function.
|
||
|
||
'gdb.TYPE_CODE_INT'
|
||
The type is an integer type.
|
||
|
||
'gdb.TYPE_CODE_FLT'
|
||
A floating point type.
|
||
|
||
'gdb.TYPE_CODE_VOID'
|
||
The special type 'void'.
|
||
|
||
'gdb.TYPE_CODE_SET'
|
||
A Pascal set type.
|
||
|
||
'gdb.TYPE_CODE_RANGE'
|
||
A range type, that is, an integer type with bounds.
|
||
|
||
'gdb.TYPE_CODE_STRING'
|
||
A string type. Note that this is only used for certain languages
|
||
with language-defined string types; C strings are not represented
|
||
this way.
|
||
|
||
'gdb.TYPE_CODE_BITSTRING'
|
||
A string of bits. It is deprecated.
|
||
|
||
'gdb.TYPE_CODE_ERROR'
|
||
An unknown or erroneous type.
|
||
|
||
'gdb.TYPE_CODE_METHOD'
|
||
A method type, as found in C++ or Java.
|
||
|
||
'gdb.TYPE_CODE_METHODPTR'
|
||
A pointer-to-member-function.
|
||
|
||
'gdb.TYPE_CODE_MEMBERPTR'
|
||
A pointer-to-member.
|
||
|
||
'gdb.TYPE_CODE_REF'
|
||
A reference type.
|
||
|
||
'gdb.TYPE_CODE_CHAR'
|
||
A character type.
|
||
|
||
'gdb.TYPE_CODE_BOOL'
|
||
A boolean type.
|
||
|
||
'gdb.TYPE_CODE_COMPLEX'
|
||
A complex float type.
|
||
|
||
'gdb.TYPE_CODE_TYPEDEF'
|
||
A typedef to some other type.
|
||
|
||
'gdb.TYPE_CODE_NAMESPACE'
|
||
A C++ namespace.
|
||
|
||
'gdb.TYPE_CODE_DECFLOAT'
|
||
A decimal floating point type.
|
||
|
||
'gdb.TYPE_CODE_INTERNAL_FUNCTION'
|
||
A function internal to GDB. This is the type used to represent
|
||
convenience functions.
|
||
|
||
Further support for types is provided in the 'gdb.types' Python
|
||
module (*note gdb.types::).
|
||
|
||
|
||
File: gdb.info, Node: Pretty Printing API, Next: Selecting Pretty-Printers, Prev: Types In Python, Up: Python API
|
||
|
||
23.2.2.5 Pretty Printing API
|
||
............................
|
||
|
||
An example output is provided (*note Pretty Printing::).
|
||
|
||
A pretty-printer is just an object that holds a value and implements
|
||
a specific interface, defined here.
|
||
|
||
-- Function: pretty_printer.children (self)
|
||
GDB will call this method on a pretty-printer to compute the
|
||
children of the pretty-printer's value.
|
||
|
||
This method must return an object conforming to the Python iterator
|
||
protocol. Each item returned by the iterator must be a tuple
|
||
holding two elements. The first element is the "name" of the
|
||
child; the second element is the child's value. The value can be
|
||
any Python object which is convertible to a GDB value.
|
||
|
||
This method is optional. If it does not exist, GDB will act as
|
||
though the value has no children.
|
||
|
||
-- Function: pretty_printer.display_hint (self)
|
||
The CLI may call this method and use its result to change the
|
||
formatting of a value. The result will also be supplied to an MI
|
||
consumer as a 'displayhint' attribute of the variable being
|
||
printed.
|
||
|
||
This method is optional. If it does exist, this method must return
|
||
a string.
|
||
|
||
Some display hints are predefined by GDB:
|
||
|
||
'array'
|
||
Indicate that the object being printed is "array-like". The
|
||
CLI uses this to respect parameters such as 'set print
|
||
elements' and 'set print array'.
|
||
|
||
'map'
|
||
Indicate that the object being printed is "map-like", and that
|
||
the children of this value can be assumed to alternate between
|
||
keys and values.
|
||
|
||
'string'
|
||
Indicate that the object being printed is "string-like". If
|
||
the printer's 'to_string' method returns a Python string of
|
||
some kind, then GDB will call its internal language-specific
|
||
string-printing function to format the string. For the CLI
|
||
this means adding quotation marks, possibly escaping some
|
||
characters, respecting 'set print elements', and the like.
|
||
|
||
-- Function: pretty_printer.to_string (self)
|
||
GDB will call this method to display the string representation of
|
||
the value passed to the object's constructor.
|
||
|
||
When printing from the CLI, if the 'to_string' method exists, then
|
||
GDB will prepend its result to the values returned by 'children'.
|
||
Exactly how this formatting is done is dependent on the display
|
||
hint, and may change as more hints are added. Also, depending on
|
||
the print settings (*note Print Settings::), the CLI may print just
|
||
the result of 'to_string' in a stack trace, omitting the result of
|
||
'children'.
|
||
|
||
If this method returns a string, it is printed verbatim.
|
||
|
||
Otherwise, if this method returns an instance of 'gdb.Value', then
|
||
GDB prints this value. This may result in a call to another
|
||
pretty-printer.
|
||
|
||
If instead the method returns a Python value which is convertible
|
||
to a 'gdb.Value', then GDB performs the conversion and prints the
|
||
resulting value. Again, this may result in a call to another
|
||
pretty-printer. Python scalars (integers, floats, and booleans)
|
||
and strings are convertible to 'gdb.Value'; other types are not.
|
||
|
||
Finally, if this method returns 'None' then no further operations
|
||
are peformed in this method and nothing is printed.
|
||
|
||
If the result is not one of these types, an exception is raised.
|
||
|
||
GDB provides a function which can be used to look up the default
|
||
pretty-printer for a 'gdb.Value':
|
||
|
||
-- Function: gdb.default_visualizer (value)
|
||
This function takes a 'gdb.Value' object as an argument. If a
|
||
pretty-printer for this value exists, then it is returned. If no
|
||
such printer exists, then this returns 'None'.
|
||
|
||
|
||
File: gdb.info, Node: Selecting Pretty-Printers, Next: Writing a Pretty-Printer, Prev: Pretty Printing API, Up: Python API
|
||
|
||
23.2.2.6 Selecting Pretty-Printers
|
||
..................................
|
||
|
||
The Python list 'gdb.pretty_printers' contains an array of functions or
|
||
callable objects that have been registered via addition as a
|
||
pretty-printer. Printers in this list are called 'global' printers,
|
||
they're available when debugging all inferiors. Each 'gdb.Progspace'
|
||
contains a 'pretty_printers' attribute. Each 'gdb.Objfile' also
|
||
contains a 'pretty_printers' attribute.
|
||
|
||
Each function on these lists is passed a single 'gdb.Value' argument
|
||
and should return a pretty-printer object conforming to the interface
|
||
definition above (*note Pretty Printing API::). If a function cannot
|
||
create a pretty-printer for the value, it should return 'None'.
|
||
|
||
GDB first checks the 'pretty_printers' attribute of each
|
||
'gdb.Objfile' in the current program space and iteratively calls each
|
||
enabled lookup routine in the list for that 'gdb.Objfile' until it
|
||
receives a pretty-printer object. If no pretty-printer is found in the
|
||
objfile lists, GDB then searches the pretty-printer list of the current
|
||
program space, calling each enabled function until an object is
|
||
returned. After these lists have been exhausted, it tries the global
|
||
'gdb.pretty_printers' list, again calling each enabled function until an
|
||
object is returned.
|
||
|
||
The order in which the objfiles are searched is not specified. For a
|
||
given list, functions are always invoked from the head of the list, and
|
||
iterated over sequentially until the end of the list, or a printer
|
||
object is returned.
|
||
|
||
For various reasons a pretty-printer may not work. For example, the
|
||
underlying data structure may have changed and the pretty-printer is out
|
||
of date.
|
||
|
||
The consequences of a broken pretty-printer are severe enough that
|
||
GDB provides support for enabling and disabling individual printers.
|
||
For example, if 'print frame-arguments' is on, a backtrace can become
|
||
highly illegible if any argument is printed with a broken printer.
|
||
|
||
Pretty-printers are enabled and disabled by attaching an 'enabled'
|
||
attribute to the registered function or callable object. If this
|
||
attribute is present and its value is 'False', the printer is disabled,
|
||
otherwise the printer is enabled.
|
||
|
||
|
||
File: gdb.info, Node: Writing a Pretty-Printer, Next: Type Printing API, Prev: Selecting Pretty-Printers, Up: Python API
|
||
|
||
23.2.2.7 Writing a Pretty-Printer
|
||
.................................
|
||
|
||
A pretty-printer consists of two parts: a lookup function to detect if
|
||
the type is supported, and the printer itself.
|
||
|
||
Here is an example showing how a 'std::string' printer might be
|
||
written. *Note Pretty Printing API::, for details on the API this class
|
||
must provide.
|
||
|
||
class StdStringPrinter(object):
|
||
"Print a std::string"
|
||
|
||
def __init__(self, val):
|
||
self.val = val
|
||
|
||
def to_string(self):
|
||
return self.val['_M_dataplus']['_M_p']
|
||
|
||
def display_hint(self):
|
||
return 'string'
|
||
|
||
And here is an example showing how a lookup function for the printer
|
||
example above might be written.
|
||
|
||
def str_lookup_function(val):
|
||
lookup_tag = val.type.tag
|
||
if lookup_tag == None:
|
||
return None
|
||
regex = re.compile("^std::basic_string<char,.*>$")
|
||
if regex.match(lookup_tag):
|
||
return StdStringPrinter(val)
|
||
return None
|
||
|
||
The example lookup function extracts the value's type, and attempts
|
||
to match it to a type that it can pretty-print. If it is a type the
|
||
printer can pretty-print, it will return a printer object. If not, it
|
||
returns 'None'.
|
||
|
||
We recommend that you put your core pretty-printers into a Python
|
||
package. If your pretty-printers are for use with a library, we further
|
||
recommend embedding a version number into the package name. This
|
||
practice will enable GDB to load multiple versions of your
|
||
pretty-printers at the same time, because they will have different
|
||
names.
|
||
|
||
You should write auto-loaded code (*note Python Auto-loading::) such
|
||
that it can be evaluated multiple times without changing its meaning.
|
||
An ideal auto-load file will consist solely of 'import's of your printer
|
||
modules, followed by a call to a register pretty-printers with the
|
||
current objfile.
|
||
|
||
Taken as a whole, this approach will scale nicely to multiple
|
||
inferiors, each potentially using a different library version.
|
||
Embedding a version number in the Python package name will ensure that
|
||
GDB is able to load both sets of printers simultaneously. Then, because
|
||
the search for pretty-printers is done by objfile, and because your
|
||
auto-loaded code took care to register your library's printers with a
|
||
specific objfile, GDB will find the correct printers for the specific
|
||
version of the library used by each inferior.
|
||
|
||
To continue the 'std::string' example (*note Pretty Printing API::),
|
||
this code might appear in 'gdb.libstdcxx.v6':
|
||
|
||
def register_printers(objfile):
|
||
objfile.pretty_printers.append(str_lookup_function)
|
||
|
||
And then the corresponding contents of the auto-load file would be:
|
||
|
||
import gdb.libstdcxx.v6
|
||
gdb.libstdcxx.v6.register_printers(gdb.current_objfile())
|
||
|
||
The previous example illustrates a basic pretty-printer. There are a
|
||
few things that can be improved on. The printer doesn't have a name,
|
||
making it hard to identify in a list of installed printers. The lookup
|
||
function has a name, but lookup functions can have arbitrary, even
|
||
identical, names.
|
||
|
||
Second, the printer only handles one type, whereas a library
|
||
typically has several types. One could install a lookup function for
|
||
each desired type in the library, but one could also have a single
|
||
lookup function recognize several types. The latter is the conventional
|
||
way this is handled. If a pretty-printer can handle multiple data
|
||
types, then its "subprinters" are the printers for the individual data
|
||
types.
|
||
|
||
The 'gdb.printing' module provides a formal way of solving these
|
||
problems (*note gdb.printing::). Here is another example that handles
|
||
multiple types.
|
||
|
||
These are the types we are going to pretty-print:
|
||
|
||
struct foo { int a, b; };
|
||
struct bar { struct foo x, y; };
|
||
|
||
Here are the printers:
|
||
|
||
class fooPrinter:
|
||
"""Print a foo object."""
|
||
|
||
def __init__(self, val):
|
||
self.val = val
|
||
|
||
def to_string(self):
|
||
return ("a=<" + str(self.val["a"]) +
|
||
"> b=<" + str(self.val["b"]) + ">")
|
||
|
||
class barPrinter:
|
||
"""Print a bar object."""
|
||
|
||
def __init__(self, val):
|
||
self.val = val
|
||
|
||
def to_string(self):
|
||
return ("x=<" + str(self.val["x"]) +
|
||
"> y=<" + str(self.val["y"]) + ">")
|
||
|
||
This example doesn't need a lookup function, that is handled by the
|
||
'gdb.printing' module. Instead a function is provided to build up the
|
||
object that handles the lookup.
|
||
|
||
import gdb.printing
|
||
|
||
def build_pretty_printer():
|
||
pp = gdb.printing.RegexpCollectionPrettyPrinter(
|
||
"my_library")
|
||
pp.add_printer('foo', '^foo$', fooPrinter)
|
||
pp.add_printer('bar', '^bar$', barPrinter)
|
||
return pp
|
||
|
||
And here is the autoload support:
|
||
|
||
import gdb.printing
|
||
import my_library
|
||
gdb.printing.register_pretty_printer(
|
||
gdb.current_objfile(),
|
||
my_library.build_pretty_printer())
|
||
|
||
Finally, when this printer is loaded into GDB, here is the
|
||
corresponding output of 'info pretty-printer':
|
||
|
||
(gdb) info pretty-printer
|
||
my_library.so:
|
||
my_library
|
||
foo
|
||
bar
|
||
|
||
|
||
File: gdb.info, Node: Type Printing API, Next: Frame Filter API, Prev: Writing a Pretty-Printer, Up: Python API
|
||
|
||
23.2.2.8 Type Printing API
|
||
..........................
|
||
|
||
GDB provides a way for Python code to customize type display. This is
|
||
mainly useful for substituting canonical typedef names for types.
|
||
|
||
A "type printer" is just a Python object conforming to a certain
|
||
protocol. A simple base class implementing the protocol is provided;
|
||
see *note gdb.types::. A type printer must supply at least:
|
||
|
||
-- Instance Variable of type_printer: enabled
|
||
A boolean which is True if the printer is enabled, and False
|
||
otherwise. This is manipulated by the 'enable type-printer' and
|
||
'disable type-printer' commands.
|
||
|
||
-- Instance Variable of type_printer: name
|
||
The name of the type printer. This must be a string. This is used
|
||
by the 'enable type-printer' and 'disable type-printer' commands.
|
||
|
||
-- Method on type_printer: instantiate (self)
|
||
This is called by GDB at the start of type-printing. It is only
|
||
called if the type printer is enabled. This method must return a
|
||
new object that supplies a 'recognize' method, as described below.
|
||
|
||
When displaying a type, say via the 'ptype' command, GDB will compute
|
||
a list of type recognizers. This is done by iterating first over the
|
||
per-objfile type printers (*note Objfiles In Python::), followed by the
|
||
per-progspace type printers (*note Progspaces In Python::), and finally
|
||
the global type printers.
|
||
|
||
GDB will call the 'instantiate' method of each enabled type printer.
|
||
If this method returns 'None', then the result is ignored; otherwise, it
|
||
is appended to the list of recognizers.
|
||
|
||
Then, when GDB is going to display a type name, it iterates over the
|
||
list of recognizers. For each one, it calls the recognition function,
|
||
stopping if the function returns a non-'None' value. The recognition
|
||
function is defined as:
|
||
|
||
-- Method on type_recognizer: recognize (self, type)
|
||
If TYPE is not recognized, return 'None'. Otherwise, return a
|
||
string which is to be printed as the name of TYPE. The TYPE
|
||
argument will be an instance of 'gdb.Type' (*note Types In
|
||
Python::).
|
||
|
||
GDB uses this two-pass approach so that type printers can efficiently
|
||
cache information without holding on to it too long. For example, it
|
||
can be convenient to look up type information in a type printer and hold
|
||
it for a recognizer's lifetime; if a single pass were done then type
|
||
printers would have to make use of the event system in order to avoid
|
||
holding information that could become stale as the inferior changed.
|
||
|
||
|
||
File: gdb.info, Node: Frame Filter API, Next: Frame Decorator API, Prev: Type Printing API, Up: Python API
|
||
|
||
23.2.2.9 Filtering Frames.
|
||
..........................
|
||
|
||
Frame filters are Python objects that manipulate the visibility of a
|
||
frame or frames when a backtrace (*note Backtrace::) is printed by GDB.
|
||
|
||
Only commands that print a backtrace, or, in the case of GDB/MI
|
||
commands (*note GDB/MI::), those that return a collection of frames are
|
||
affected. The commands that work with frame filters are:
|
||
|
||
'backtrace' (*note The backtrace command: backtrace-command.),
|
||
'-stack-list-frames' (*note The -stack-list-frames command:
|
||
-stack-list-frames.), '-stack-list-variables' (*note The
|
||
-stack-list-variables command: -stack-list-variables.),
|
||
'-stack-list-arguments' *note The -stack-list-arguments command:
|
||
-stack-list-arguments.) and '-stack-list-locals' (*note The
|
||
-stack-list-locals command: -stack-list-locals.).
|
||
|
||
A frame filter works by taking an iterator as an argument, applying
|
||
actions to the contents of that iterator, and returning another iterator
|
||
(or, possibly, the same iterator it was provided in the case where the
|
||
filter does not perform any operations). Typically, frame filters
|
||
utilize tools such as the Python's 'itertools' module to work with and
|
||
create new iterators from the source iterator. Regardless of how a
|
||
filter chooses to apply actions, it must not alter the underlying GDB
|
||
frame or frames, or attempt to alter the call-stack within GDB. This
|
||
preserves data integrity within GDB. Frame filters are executed on a
|
||
priority basis and care should be taken that some frame filters may have
|
||
been executed before, and that some frame filters will be executed
|
||
after.
|
||
|
||
An important consideration when designing frame filters, and well
|
||
worth reflecting upon, is that frame filters should avoid unwinding the
|
||
call stack if possible. Some stacks can run very deep, into the tens of
|
||
thousands in some cases. To search every frame when a frame filter
|
||
executes may be too expensive at that step. The frame filter cannot
|
||
know how many frames it has to iterate over, and it may have to iterate
|
||
through them all. This ends up duplicating effort as GDB performs this
|
||
iteration when it prints the frames. If the filter can defer unwinding
|
||
frames until frame decorators are executed, after the last filter has
|
||
executed, it should. *Note Frame Decorator API::, for more information
|
||
on decorators. Also, there are examples for both frame decorators and
|
||
filters in later chapters. *Note Writing a Frame Filter::, for more
|
||
information.
|
||
|
||
The Python dictionary 'gdb.frame_filters' contains key/object
|
||
pairings that comprise a frame filter. Frame filters in this dictionary
|
||
are called 'global' frame filters, and they are available when debugging
|
||
all inferiors. These frame filters must register with the dictionary
|
||
directly. In addition to the 'global' dictionary, there are other
|
||
dictionaries that are loaded with different inferiors via auto-loading
|
||
(*note Python Auto-loading::). The two other areas where frame filter
|
||
dictionaries can be found are: 'gdb.Progspace' which contains a
|
||
'frame_filters' dictionary attribute, and each 'gdb.Objfile' object
|
||
which also contains a 'frame_filters' dictionary attribute.
|
||
|
||
When a command is executed from GDB that is compatible with frame
|
||
filters, GDB combines the 'global', 'gdb.Progspace' and all
|
||
'gdb.Objfile' dictionaries currently loaded. All of the 'gdb.Objfile'
|
||
dictionaries are combined, as several frames, and thus several object
|
||
files, might be in use. GDB then prunes any frame filter whose
|
||
'enabled' attribute is 'False'. This pruned list is then sorted
|
||
according to the 'priority' attribute in each filter.
|
||
|
||
Once the dictionaries are combined, pruned and sorted, GDB creates an
|
||
iterator which wraps each frame in the call stack in a 'FrameDecorator'
|
||
object, and calls each filter in order. The output from the previous
|
||
filter will always be the input to the next filter, and so on.
|
||
|
||
Frame filters have a mandatory interface which each frame filter must
|
||
implement, defined here:
|
||
|
||
-- Function: FrameFilter.filter (iterator)
|
||
GDB will call this method on a frame filter when it has reached the
|
||
order in the priority list for that filter.
|
||
|
||
For example, if there are four frame filters:
|
||
|
||
Name Priority
|
||
|
||
Filter1 5
|
||
Filter2 10
|
||
Filter3 100
|
||
Filter4 1
|
||
|
||
The order that the frame filters will be called is:
|
||
|
||
Filter3 -> Filter2 -> Filter1 -> Filter4
|
||
|
||
Note that the output from 'Filter3' is passed to the input of
|
||
'Filter2', and so on.
|
||
|
||
This 'filter' method is passed a Python iterator. This iterator
|
||
contains a sequence of frame decorators that wrap each 'gdb.Frame',
|
||
or a frame decorator that wraps another frame decorator. The first
|
||
filter that is executed in the sequence of frame filters will
|
||
receive an iterator entirely comprised of default 'FrameDecorator'
|
||
objects. However, after each frame filter is executed, the
|
||
previous frame filter may have wrapped some or all of the frame
|
||
decorators with their own frame decorator. As frame decorators
|
||
must also conform to a mandatory interface, these decorators can be
|
||
assumed to act in a uniform manner (*note Frame Decorator API::).
|
||
|
||
This method must return an object conforming to the Python iterator
|
||
protocol. Each item in the iterator must be an object conforming
|
||
to the frame decorator interface. If a frame filter does not wish
|
||
to perform any operations on this iterator, it should return that
|
||
iterator untouched.
|
||
|
||
This method is not optional. If it does not exist, GDB will raise
|
||
and print an error.
|
||
|
||
-- Variable: FrameFilter.name
|
||
The 'name' attribute must be Python string which contains the name
|
||
of the filter displayed by GDB (*note Frame Filter Management::).
|
||
This attribute may contain any combination of letters or numbers.
|
||
Care should be taken to ensure that it is unique. This attribute
|
||
is mandatory.
|
||
|
||
-- Variable: FrameFilter.enabled
|
||
The 'enabled' attribute must be Python boolean. This attribute
|
||
indicates to GDB whether the frame filter is enabled, and should be
|
||
considered when frame filters are executed. If 'enabled' is
|
||
'True', then the frame filter will be executed when any of the
|
||
backtrace commands detailed earlier in this chapter are executed.
|
||
If 'enabled' is 'False', then the frame filter will not be
|
||
executed. This attribute is mandatory.
|
||
|
||
-- Variable: FrameFilter.priority
|
||
The 'priority' attribute must be Python integer. This attribute
|
||
controls the order of execution in relation to other frame filters.
|
||
There are no imposed limits on the range of 'priority' other than
|
||
it must be a valid integer. The higher the 'priority' attribute,
|
||
the sooner the frame filter will be executed in relation to other
|
||
frame filters. Although 'priority' can be negative, it is
|
||
recommended practice to assume zero is the lowest priority that a
|
||
frame filter can be assigned. Frame filters that have the same
|
||
priority are executed in unsorted order in that priority slot.
|
||
This attribute is mandatory.
|
||
|
||
|
||
File: gdb.info, Node: Frame Decorator API, Next: Writing a Frame Filter, Prev: Frame Filter API, Up: Python API
|
||
|
||
23.2.2.10 Decorating Frames.
|
||
............................
|
||
|
||
Frame decorators are sister objects to frame filters (*note Frame Filter
|
||
API::). Frame decorators are applied by a frame filter and can only be
|
||
used in conjunction with frame filters.
|
||
|
||
The purpose of a frame decorator is to customize the printed content
|
||
of each 'gdb.Frame' in commands where frame filters are executed. This
|
||
concept is called decorating a frame. Frame decorators decorate a
|
||
'gdb.Frame' with Python code contained within each API call. This
|
||
separates the actual data contained in a 'gdb.Frame' from the decorated
|
||
data produced by a frame decorator. This abstraction is necessary to
|
||
maintain integrity of the data contained in each 'gdb.Frame'.
|
||
|
||
Frame decorators have a mandatory interface, defined below.
|
||
|
||
GDB already contains a frame decorator called 'FrameDecorator'. This
|
||
contains substantial amounts of boilerplate code to decorate the content
|
||
of a 'gdb.Frame'. It is recommended that other frame decorators inherit
|
||
and extend this object, and only to override the methods needed.
|
||
|
||
-- Function: FrameDecorator.elided (self)
|
||
|
||
The 'elided' method groups frames together in a hierarchical
|
||
system. An example would be an interpreter, where multiple
|
||
low-level frames make up a single call in the interpreted language.
|
||
In this example, the frame filter would elide the low-level frames
|
||
and present a single high-level frame, representing the call in the
|
||
interpreted language, to the user.
|
||
|
||
The 'elided' function must return an iterable and this iterable
|
||
must contain the frames that are being elided wrapped in a suitable
|
||
frame decorator. If no frames are being elided this function may
|
||
return an empty iterable, or 'None'. Elided frames are indented
|
||
from normal frames in a 'CLI' backtrace, or in the case of
|
||
'GDB/MI', are placed in the 'children' field of the eliding frame.
|
||
|
||
It is the frame filter's task to also filter out the elided frames
|
||
from the source iterator. This will avoid printing the frame
|
||
twice.
|
||
|
||
-- Function: FrameDecorator.function (self)
|
||
|
||
This method returns the name of the function in the frame that is
|
||
to be printed.
|
||
|
||
This method must return a Python string describing the function, or
|
||
'None'.
|
||
|
||
If this function returns 'None', GDB will not print any data for
|
||
this field.
|
||
|
||
-- Function: FrameDecorator.address (self)
|
||
|
||
This method returns the address of the frame that is to be printed.
|
||
|
||
This method must return a Python numeric integer type of sufficient
|
||
size to describe the address of the frame, or 'None'.
|
||
|
||
If this function returns a 'None', GDB will not print any data for
|
||
this field.
|
||
|
||
-- Function: FrameDecorator.filename (self)
|
||
|
||
This method returns the filename and path associated with this
|
||
frame.
|
||
|
||
This method must return a Python string containing the filename and
|
||
the path to the object file backing the frame, or 'None'.
|
||
|
||
If this function returns a 'None', GDB will not print any data for
|
||
this field.
|
||
|
||
-- Function: FrameDecorator.line (self):
|
||
|
||
This method returns the line number associated with the current
|
||
position within the function addressed by this frame.
|
||
|
||
This method must return a Python integer type, or 'None'.
|
||
|
||
If this function returns a 'None', GDB will not print any data for
|
||
this field.
|
||
|
||
-- Function: FrameDecorator.frame_args (self)
|
||
|
||
This method must return an iterable, or 'None'. Returning an empty
|
||
iterable, or 'None' means frame arguments will not be printed for
|
||
this frame. This iterable must contain objects that implement two
|
||
methods, described here.
|
||
|
||
This object must implement a 'argument' method which takes a single
|
||
'self' parameter and must return a 'gdb.Symbol' (*note Symbols In
|
||
Python::), or a Python string. The object must also implement a
|
||
'value' method which takes a single 'self' parameter and must
|
||
return a 'gdb.Value' (*note Values From Inferior::), a Python
|
||
value, or 'None'. If the 'value' method returns 'None', and the
|
||
'argument' method returns a 'gdb.Symbol', GDB will look-up and
|
||
print the value of the 'gdb.Symbol' automatically.
|
||
|
||
A brief example:
|
||
|
||
class SymValueWrapper():
|
||
|
||
def __init__(self, symbol, value):
|
||
self.sym = symbol
|
||
self.val = value
|
||
|
||
def value(self):
|
||
return self.val
|
||
|
||
def symbol(self):
|
||
return self.sym
|
||
|
||
class SomeFrameDecorator()
|
||
...
|
||
...
|
||
def frame_args(self):
|
||
args = []
|
||
try:
|
||
block = self.inferior_frame.block()
|
||
except:
|
||
return None
|
||
|
||
# Iterate over all symbols in a block. Only add
|
||
# symbols that are arguments.
|
||
for sym in block:
|
||
if not sym.is_argument:
|
||
continue
|
||
args.append(SymValueWrapper(sym,None))
|
||
|
||
# Add example synthetic argument.
|
||
args.append(SymValueWrapper(``foo'', 42))
|
||
|
||
return args
|
||
|
||
-- Function: FrameDecorator.frame_locals (self)
|
||
|
||
This method must return an iterable or 'None'. Returning an empty
|
||
iterable, or 'None' means frame local arguments will not be printed
|
||
for this frame.
|
||
|
||
The object interface, the description of the various strategies for
|
||
reading frame locals, and the example are largely similar to those
|
||
described in the 'frame_args' function, (*note The frame filter
|
||
frame_args function: frame_args.). Below is a modified example:
|
||
|
||
class SomeFrameDecorator()
|
||
...
|
||
...
|
||
def frame_locals(self):
|
||
vars = []
|
||
try:
|
||
block = self.inferior_frame.block()
|
||
except:
|
||
return None
|
||
|
||
# Iterate over all symbols in a block. Add all
|
||
# symbols, except arguments.
|
||
for sym in block:
|
||
if sym.is_argument:
|
||
continue
|
||
vars.append(SymValueWrapper(sym,None))
|
||
|
||
# Add an example of a synthetic local variable.
|
||
vars.append(SymValueWrapper(``bar'', 99))
|
||
|
||
return vars
|
||
|
||
-- Function: FrameDecorator.inferior_frame (self):
|
||
|
||
This method must return the underlying 'gdb.Frame' that this frame
|
||
decorator is decorating. GDB requires the underlying frame for
|
||
internal frame information to determine how to print certain values
|
||
when printing a frame.
|
||
|
||
|
||
File: gdb.info, Node: Writing a Frame Filter, Next: Xmethods In Python, Prev: Frame Decorator API, Up: Python API
|
||
|
||
23.2.2.11 Writing a Frame Filter
|
||
................................
|
||
|
||
There are three basic elements that a frame filter must implement: it
|
||
must correctly implement the documented interface (*note Frame Filter
|
||
API::), it must register itself with GDB, and finally, it must decide if
|
||
it is to work on the data provided by GDB. In all cases, whether it
|
||
works on the iterator or not, each frame filter must return an iterator.
|
||
A bare-bones frame filter follows the pattern in the following example.
|
||
|
||
import gdb
|
||
|
||
class FrameFilter():
|
||
|
||
def __init__(self):
|
||
# Frame filter attribute creation.
|
||
#
|
||
# 'name' is the name of the filter that GDB will display.
|
||
#
|
||
# 'priority' is the priority of the filter relative to other
|
||
# filters.
|
||
#
|
||
# 'enabled' is a boolean that indicates whether this filter is
|
||
# enabled and should be executed.
|
||
|
||
self.name = "Foo"
|
||
self.priority = 100
|
||
self.enabled = True
|
||
|
||
# Register this frame filter with the global frame_filters
|
||
# dictionary.
|
||
gdb.frame_filters[self.name] = self
|
||
|
||
def filter(self, frame_iter):
|
||
# Just return the iterator.
|
||
return frame_iter
|
||
|
||
The frame filter in the example above implements the three
|
||
requirements for all frame filters. It implements the API, self
|
||
registers, and makes a decision on the iterator (in this case, it just
|
||
returns the iterator untouched).
|
||
|
||
The first step is attribute creation and assignment, and as shown in
|
||
the comments the filter assigns the following attributes: 'name',
|
||
'priority' and whether the filter should be enabled with the 'enabled'
|
||
attribute.
|
||
|
||
The second step is registering the frame filter with the dictionary
|
||
or dictionaries that the frame filter has interest in. As shown in the
|
||
comments, this filter just registers itself with the global dictionary
|
||
'gdb.frame_filters'. As noted earlier, 'gdb.frame_filters' is a
|
||
dictionary that is initialized in the 'gdb' module when GDB starts.
|
||
What dictionary a filter registers with is an important consideration.
|
||
Generally, if a filter is specific to a set of code, it should be
|
||
registered either in the 'objfile' or 'progspace' dictionaries as they
|
||
are specific to the program currently loaded in GDB. The global
|
||
dictionary is always present in GDB and is never unloaded. Any filters
|
||
registered with the global dictionary will exist until GDB exits. To
|
||
avoid filters that may conflict, it is generally better to register
|
||
frame filters against the dictionaries that more closely align with the
|
||
usage of the filter currently in question. *Note Python Auto-loading::,
|
||
for further information on auto-loading Python scripts.
|
||
|
||
GDB takes a hands-off approach to frame filter registration,
|
||
therefore it is the frame filter's responsibility to ensure registration
|
||
has occurred, and that any exceptions are handled appropriately. In
|
||
particular, you may wish to handle exceptions relating to Python
|
||
dictionary key uniqueness. It is mandatory that the dictionary key is
|
||
the same as frame filter's 'name' attribute. When a user manages frame
|
||
filters (*note Frame Filter Management::), the names GDB will display
|
||
are those contained in the 'name' attribute.
|
||
|
||
The final step of this example is the implementation of the 'filter'
|
||
method. As shown in the example comments, we define the 'filter' method
|
||
and note that the method must take an iterator, and also must return an
|
||
iterator. In this bare-bones example, the frame filter is not very
|
||
useful as it just returns the iterator untouched. However this is a
|
||
valid operation for frame filters that have the 'enabled' attribute set,
|
||
but decide not to operate on any frames.
|
||
|
||
In the next example, the frame filter operates on all frames and
|
||
utilizes a frame decorator to perform some work on the frames. *Note
|
||
Frame Decorator API::, for further information on the frame decorator
|
||
interface.
|
||
|
||
This example works on inlined frames. It highlights frames which are
|
||
inlined by tagging them with an "[inlined]" tag. By applying a frame
|
||
decorator to all frames with the Python 'itertools imap' method, the
|
||
example defers actions to the frame decorator. Frame decorators are
|
||
only processed when GDB prints the backtrace.
|
||
|
||
This introduces a new decision making topic: whether to perform
|
||
decision making operations at the filtering step, or at the printing
|
||
step. In this example's approach, it does not perform any filtering
|
||
decisions at the filtering step beyond mapping a frame decorator to each
|
||
frame. This allows the actual decision making to be performed when each
|
||
frame is printed. This is an important consideration, and well worth
|
||
reflecting upon when designing a frame filter. An issue that frame
|
||
filters should avoid is unwinding the stack if possible. Some stacks
|
||
can run very deep, into the tens of thousands in some cases. To search
|
||
every frame to determine if it is inlined ahead of time may be too
|
||
expensive at the filtering step. The frame filter cannot know how many
|
||
frames it has to iterate over, and it would have to iterate through them
|
||
all. This ends up duplicating effort as GDB performs this iteration
|
||
when it prints the frames.
|
||
|
||
In this example decision making can be deferred to the printing step.
|
||
As each frame is printed, the frame decorator can examine each frame in
|
||
turn when GDB iterates. From a performance viewpoint, this is the most
|
||
appropriate decision to make as it avoids duplicating the effort that
|
||
the printing step would undertake anyway. Also, if there are many frame
|
||
filters unwinding the stack during filtering, it can substantially delay
|
||
the printing of the backtrace which will result in large memory usage,
|
||
and a poor user experience.
|
||
|
||
class InlineFilter():
|
||
|
||
def __init__(self):
|
||
self.name = "InlinedFrameFilter"
|
||
self.priority = 100
|
||
self.enabled = True
|
||
gdb.frame_filters[self.name] = self
|
||
|
||
def filter(self, frame_iter):
|
||
frame_iter = itertools.imap(InlinedFrameDecorator,
|
||
frame_iter)
|
||
return frame_iter
|
||
|
||
This frame filter is somewhat similar to the earlier example, except
|
||
that the 'filter' method applies a frame decorator object called
|
||
'InlinedFrameDecorator' to each element in the iterator. The 'imap'
|
||
Python method is light-weight. It does not proactively iterate over the
|
||
iterator, but rather creates a new iterator which wraps the existing
|
||
one.
|
||
|
||
Below is the frame decorator for this example.
|
||
|
||
class InlinedFrameDecorator(FrameDecorator):
|
||
|
||
def __init__(self, fobj):
|
||
super(InlinedFrameDecorator, self).__init__(fobj)
|
||
|
||
def function(self):
|
||
frame = fobj.inferior_frame()
|
||
name = str(frame.name())
|
||
|
||
if frame.type() == gdb.INLINE_FRAME:
|
||
name = name + " [inlined]"
|
||
|
||
return name
|
||
|
||
This frame decorator only defines and overrides the 'function'
|
||
method. It lets the supplied 'FrameDecorator', which is shipped with
|
||
GDB, perform the other work associated with printing this frame.
|
||
|
||
The combination of these two objects create this output from a
|
||
backtrace:
|
||
|
||
#0 0x004004e0 in bar () at inline.c:11
|
||
#1 0x00400566 in max [inlined] (b=6, a=12) at inline.c:21
|
||
#2 0x00400566 in main () at inline.c:31
|
||
|
||
So in the case of this example, a frame decorator is applied to all
|
||
frames, regardless of whether they may be inlined or not. As GDB
|
||
iterates over the iterator produced by the frame filters, GDB executes
|
||
each frame decorator which then makes a decision on what to print in the
|
||
'function' callback. Using a strategy like this is a way to defer
|
||
decisions on the frame content to printing time.
|
||
|
||
Eliding Frames
|
||
--------------
|
||
|
||
It might be that the above example is not desirable for representing
|
||
inlined frames, and a hierarchical approach may be preferred. If we
|
||
want to hierarchically represent frames, the 'elided' frame decorator
|
||
interface might be preferable.
|
||
|
||
This example approaches the issue with the 'elided' method. This
|
||
example is quite long, but very simplistic. It is out-of-scope for this
|
||
section to write a complete example that comprehensively covers all
|
||
approaches of finding and printing inlined frames. However, this
|
||
example illustrates the approach an author might use.
|
||
|
||
This example comprises of three sections.
|
||
|
||
class InlineFrameFilter():
|
||
|
||
def __init__(self):
|
||
self.name = "InlinedFrameFilter"
|
||
self.priority = 100
|
||
self.enabled = True
|
||
gdb.frame_filters[self.name] = self
|
||
|
||
def filter(self, frame_iter):
|
||
return ElidingInlineIterator(frame_iter)
|
||
|
||
This frame filter is very similar to the other examples. The only
|
||
difference is this frame filter is wrapping the iterator provided to it
|
||
('frame_iter') with a custom iterator called 'ElidingInlineIterator'.
|
||
This again defers actions to when GDB prints the backtrace, as the
|
||
iterator is not traversed until printing.
|
||
|
||
The iterator for this example is as follows. It is in this section
|
||
of the example where decisions are made on the content of the backtrace.
|
||
|
||
class ElidingInlineIterator:
|
||
def __init__(self, ii):
|
||
self.input_iterator = ii
|
||
|
||
def __iter__(self):
|
||
return self
|
||
|
||
def next(self):
|
||
frame = next(self.input_iterator)
|
||
|
||
if frame.inferior_frame().type() != gdb.INLINE_FRAME:
|
||
return frame
|
||
|
||
try:
|
||
eliding_frame = next(self.input_iterator)
|
||
except StopIteration:
|
||
return frame
|
||
return ElidingFrameDecorator(eliding_frame, [frame])
|
||
|
||
This iterator implements the Python iterator protocol. When the
|
||
'next' function is called (when GDB prints each frame), the iterator
|
||
checks if this frame decorator, 'frame', is wrapping an inlined frame.
|
||
If it is not, it returns the existing frame decorator untouched. If it
|
||
is wrapping an inlined frame, it assumes that the inlined frame was
|
||
contained within the next oldest frame, 'eliding_frame', which it
|
||
fetches. It then creates and returns a frame decorator,
|
||
'ElidingFrameDecorator', which contains both the elided frame, and the
|
||
eliding frame.
|
||
|
||
class ElidingInlineDecorator(FrameDecorator):
|
||
|
||
def __init__(self, frame, elided_frames):
|
||
super(ElidingInlineDecorator, self).__init__(frame)
|
||
self.frame = frame
|
||
self.elided_frames = elided_frames
|
||
|
||
def elided(self):
|
||
return iter(self.elided_frames)
|
||
|
||
This frame decorator overrides one function and returns the inlined
|
||
frame in the 'elided' method. As before it lets 'FrameDecorator' do the
|
||
rest of the work involved in printing this frame. This produces the
|
||
following output.
|
||
|
||
#0 0x004004e0 in bar () at inline.c:11
|
||
#2 0x00400529 in main () at inline.c:25
|
||
#1 0x00400529 in max (b=6, a=12) at inline.c:15
|
||
|
||
In that output, 'max' which has been inlined into 'main' is printed
|
||
hierarchically. Another approach would be to combine the 'function'
|
||
method, and the 'elided' method to both print a marker in the inlined
|
||
frame, and also show the hierarchical relationship.
|
||
|