As discussed in Calling User-Defined Subprograms, GDB’s
print
command only knows about the physical layout of program data
structures and therefore normally displays only low-level dumps, which
are often hard to understand.
An example of this is when trying to display the contents of an Ada
standard container, such as Ada.Containers.Ordered_Maps.Map
:
with Ada.Containers.Ordered_Maps; procedure PP is package Int_To_Nat is new Ada.Containers.Ordered_Maps (Integer, Natural); Map : Int_To_Nat.Map; begin Map.Insert (1, 10); Map.Insert (2, 20); Map.Insert (3, 30); Map.Clear; -- BREAK HERE end PP;
When this program is built with debugging information and run under
GDB
up to the Map.Clear
statement, trying to print Map
will
yield information that is only relevant to the developers of the standard
containers:
(gdb) print map $1 = ( tree => ( first => 0x64e010, last => 0x64e070, root => 0x64e040, length => 3, tc => ( busy => 0, lock => 0 ) ) )
Fortunately, GDB ``has a feature called `pretty-printers
<http://docs.adacore.com/gdb-docs/html/gdb.html#Pretty-Printer-Introduction>`_,
which allows customizing how ``GDB
displays data structures. The
GDB
shipped with GNAT embeds such pretty-printers for the most
common containers in the standard library. To enable them, either run
the following command manually under GDB
or add it to your
.gdbinit
file:
python import gnatdbg; gnatdbg.setup()
Once you’ve done this, GDB
’s print
command will automatically use
these pretty-printers when appropriate. Using the previous example:
(gdb) print map $1 = pp.int_to_nat.map of length 3 = { [1] = 10, [2] = 20, [3] = 30 }
Pretty-printers are invoked each time GDB tries to display a value,
including when displaying the arguments of a called subprogram (in
GDB’s backtrace
command) or when printing the value returned by a
function (in GDB’s finish
command).
To display a value without involving pretty-printers, you can invoke
print
with its /r
option:
(gdb) print/r map $1 = ( tree => (...
You can also obtain finer control of pretty-printers: see GDB’s online documentation1 for more information.