2013-09-04 12 views
6

Ich benutze boost::mpl::string<...> Arten ausgiebig ... genug, dass es würde wirklich Hilfe bei der Fehlersuche die Typen haben ziemlich druckten in gdb.ziemlich Druck boost :: mpl :: string <...> Typen in gdb

So ... statt gdb die einzelnen ('multi wörtliche) Komponenten wie es gegenwärtig der Fall ist zeigt ...

boost::mpl::string<1668248165, 778856802, 778858343, ..., ..., 0, 0, 0, 0, 0, 0> 

Es würde die entsprechende Zeichenfolgenwert angezeigt werden, anstatt ...

boost::mpl::string<"The way out is through"> 

Ich habe gdb Makros und Python-Skripte für hübsch Drucken von STL-Containern in gdb gesehen, aber ich konnte keine für boost::mpl Strings finden. Kann mir jemand helfen?


UPDATE: Ich habe ein hinzugefügt +100 Prämie ... Ich bin auf der Suche nach einer Lösung, die die neueste GDB Unterstützung für ziemlich Druck über Python nutzt (wie here für STL-Container beschrieben).

Antwort

7

Hier ist meine Lösung unter Verwendung von boost-Pretty-Printer (https://github.com/ruediger/Boost-Pretty-Printer/wiki):

Datei mpl_printers.py:

import printers 
import re 
import string 
import struct 

@printers.register_pretty_printer 
class BoostMplString: 
    "Pretty Printer for boost::mpl::string" 
    regex = re.compile('^boost::mpl::string<(.*)>$') 

    @printers.static 
    def supports(typename): 
     return BoostMplString.regex.search(typename) 

    def __init__(self, typename, value): 
     self.typename = typename 
     self.value = value 

    def to_string(self): 
      s = '' 
      try: 
       m = BoostMplString.regex.match(self.typename) 
       args = string.split(m.group(1), ', ') 
       for packed in args: 
        i = int(packed) 
        if i == 0: 
         break 
        r = '' 
        while i != 0: 
         i, c = divmod(i, 0x100) 
         r += chr(c) 
        s += r[::-1] 
      except RuntimeError: 
       s = '[Exception]' 
      return '(boost::mpl::string) %s' % (s) 

def register_boost_mpl_printers(obj): 
    "Register Boost Pretty Printers." 
    pass 

Datei register_printers.gdb:

python 

# Add the following line in your .gdbinit: 
# source /usr/local/share/gdb/register_printers.gdb 

import sys 
sys.path.insert(0, '/usr/local/share/gdb/python') 
# You might have these, too 
# from libstdcxx.v6.printers import register_libstdcxx_printers 
from boost.printers import register_boost_printers 
from boost.mpl_printers import register_boost_mpl_printers 

# register_libstdcxx_printers(None) 
register_boost_printers(None) 
register_boost_mpl_printers(None) 

end 
  • Drucker installieren .py und die obige mpl_printers.py im Verzeichnis /usr/local/share/gdb/python/boos t.
  • Stellen Sie sicher, Sie in/usr/local/share/gdb/Python/Boost (Eine leere Datei wird es tun)
  • Installieren Sie den oben 'register_printers.gdb' in/usr/local/share ein __init__.py haben/gdb.
  • Add 'Quelle /usr/local/share/gdb/register_printers.gdb' in Ihrer .gdbinit

Test (Sie können verschiedene Verzeichnisse wählen):

#include <boost/mpl/string.hpp> 
int main() { 
    boost::mpl::string<'hell','o wo','rld'> s; 
    return 0; 
} 

gdb Test -ex 'b main' -ex 'r' -Ex 'ps' -Ex 'c' -ex 'q'

1 $ = (boost :: mpl :: string) Hallo Welt

+0

** Funktioniert wie ein Zauber! ** Und jetzt kann ich einfach andere Typenamen mit Python auf die gleiche Art verschönern. Vielen Dank. – etherice

+0

@etherice Bitte veröffentlichen Sie Ihre Drucker, eines Tages. –

+1

Um ein paar Teile in der Anleitung zu verdeutlichen: 'printers.py' und' mpl_printers.py' sollten in ein 'boost'-Unterverzeichnis (zB'/usr/local/share/gdb/python/boost') gehen damit das Modul Namen in 'register_printers.gdb' sind gültig. Außerdem muss das 'boost'-Unterverzeichnis eine '__init __.py'-Datei enthalten (die leer sein kann), so dass python es als ein Verzeichnis erkennt, das Module enthält (andernfalls wird ein' ImportError: Kein Modul namens boost.printers' error) . – etherice

Verwandte Themen