2013-09-04 14 views
6

używam boost::mpl::string<...> rodzajów intensywnie ... wystarczy, że byłoby naprawdę pomoc z debugowania mieć typy całkiem zadrukowanych w gdb.całkiem doładowania druk :: mpl :: string <...> typy w gdb

... Więc zamiast gdb pokazujący jednostkę (multicharacter dosłowne) elementy jak obecnie robi ...

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

Byłoby wyświetlić równoważną wartość ciągu zamiast ...

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

Widziałem skrypty makr i pythonów gdb dla ładnie drukowanych kontenerów STL w gdb, ale nie mogłem znaleźć jednego dla ładnie drukowanych ciągów boost::mpl. Czy ktoś może w tym pomóc?


UPDATE: Dodałem +100 Bounty ... szukam rozwiązania, które wykorzystuje najnowsze wsparcie GDB dla ładnego drukowania poprzez python (jak opisano here dla kontenerów STL).

Odpowiedz

7

Oto moje rozwiązanie wykorzystuje boost-Całkiem-drukarki (https://github.com/ruediger/Boost-Pretty-Printer/wiki):

mpl_printers.py Plik:

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 

register_printers.gdb Plik:

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 
  • zainstalować drukarki .py i powyższy plik mpl_printers.py w katalogu /usr/local/share/gdb/python/boos t.
  • Zapewnienie masz __init__.py w katalogu/usr/local/share/gdb/python/przypominającego (Pusty plik to zrobi)
  • zainstalować powyższą 'register_printers.gdb' w katalogu/usr/local/share/gdb.
  • Dodaj 'źródło /usr/local/share/gdb/register_printers.gdb' w .gdbinit

(Można wybrać różne katalogi)

Test:

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

gdb Testuj -ex 'b główne' -ex 'r' -ex 'ps' -ex 'c' -ex 'q'

$ 1 = (zwiększenie :: mpl :: string) Witaj świecie

+0

** Działa jak urok! ** Teraz mogę z łatwością upiększyć inne nazwy w pythonie używając tej samej metody. Dziękuję Ci. – etherice

+0

@etherice Proszę opublikuj swoje drukarki, pewnego dnia. –

+1

Aby wyjaśnić kilka części instrukcji: 'printers.py' i' mpl_printers.py' powinny przejść do podkatalogu 'boost' (tzn.'/Usr/local/share/gdb/python/boost'), więc moduł nazwy w 'register_printers.gdb' są prawidłowe. Również podkatalog 'boost' musi zawierać plik' __init __. Py' (który może być pusty), więc python rozpoznaje go jako katalog zawierający moduły (w przeciwnym razie pojawi się błąd 'ImportError: No module named boost.printers') . – etherice

Powiązane problemy