user2472071
user2472071

Reputation: 767

GDB printing STL data

After following the instructions given on this site: https://sourceware.org/gdb/wiki/STLSupport GDB is still unable to print the contents of stl containers like vectors, other than printing out a huge amount of useless information. When GDB loads, I also get the following errors, which I think are related to the Python that I put into ~/.gdbinit

Traceback (most recent call last):
  File "<string>", line 4, in <module>
  File "/Users/mayankp/gdb_printers/python/libstdcxx/v6/printers.py", line 1247, in register_libstdcxx_printers
    gdb.printing.register_pretty_printer(obj, libstdcxx_printer)
  File "/usr/local/share/gdb/python/gdb/printing.py", line 146, in register_pretty_printer
    printer.name)
RuntimeError: pretty-printer already registered: libstdc++-v6
/Users/mayankp/.gdbinit:6: Error in sourced command file:
Error while executing Python code.

Upvotes: 0

Views: 2217

Answers (2)

ks1322
ks1322

Reputation: 35775

When GDB loads, I also get the following errors...

It looks like instructions you followed on https://sourceware.org/gdb/wiki/STLSupport are invalid now. If you look at svn log you will see that registering of pretty printers was added in __init__.py recently:

------------------------------------------------------------------------
r215726 | redi | 2014-09-30 18:33:27 +0300 (Вт., 30 сент. 2014) | 4 lines

2014-09-30  Siva Chandra Reddy  <[email protected]>

        * python/hook.in: Only import libstdcxx.v6.
        * python/libstdcxx/v6/__init__.py: Load printers and xmethods.
------------------------------------------------------------------------

And therefore second registration throws error. You can remove it or comment out:

#register_libstdcxx_printers (None)

GDB is still unable to print the contents of stl containers

You have probably mismatched pretty printers with your gcc. See https://stackoverflow.com/a/9108404/72178 for details.

Upvotes: 2

Lukas Graf
Lukas Graf

Reputation: 32630

From your traceback it seems that the register_libstdcxx_printers() call is failing because there already is such a pretty printer registered. To avoid that, you can wrap it in a try..except to make sure instructions in .gdbinit don't interfere with the launch of GDB if they fail:

python
import sys
sys.path.insert(0, '/home/user/gdb_printers/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
try:
    register_libstdcxx_printers(None)
except:
    pass
end

(Note: You should usually never use a bare except statement without qualifying the type of exceptions you want to catch. This is a special case though, in startup configuration files like .gdbinit, .pdbrc or your PYTHONSTARTUP file you'll probably want to write defensive code like that).

But chances are this will only get rid of the ugly traceback for you, and printing of STL vectors still wont work. Because it seems there is already a pretty printer registered from somewhere else.

Make sure the path /home/user/gdb_printers/python actually matches the path where you checked out the module mentioned in the STLSupport docs.

Upvotes: 0

Related Questions