2013-09-04 23 views
6

Tôi sử dụng boost::mpl::string<...> các loại rộng rãi ... đủ để nó thực sự giúp gỡ lỗi để có các loại in đẹp trong gdb.tăng cường in ấn :: mpl :: string <...> các loại trong gdb

... Vì vậy, thay vì gdb cho thấy các thành phần như nó hiện đang làm cá nhân (multicharacter đen) ...

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

Nó sẽ hiển thị giá trị chuỗi tương đương thay vì ...

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

Tôi đã xem gdb các macro và các tập lệnh python cho các hộp chứa STL khá trong gdb, nhưng tôi không thể tìm thấy một cho các chuỗi boost::mpl in đẹp. Bất cứ ai có thể giúp đỡ với điều này?


UPDATE: Tôi đã thêm một +100 tiền thưởng ... Tôi đang tìm kiếm một giải pháp mà sử dụng sự hỗ trợ mới nhất GDB cho khá-in qua trăn (như mô tả here cho STL container).

Trả lời

7

Đây là giải pháp của tôi sử dụng Boost-Khá-in (https://github.com/ruediger/Boost-Pretty-Printer/wiki):

file 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 

file 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 
  • Cài đặt máy in .py và mpl_printers.py ở trên trong thư mục /usr/local/share/gdb/python/boos t.
  • Đảm bảo bạn có một __init__.py trong/usr/local/share/gdb/python/tăng (Một tập tin rỗng sẽ làm điều đó)
  • Cài đặt trên 'register_printers.gdb' trong/usr/local/share/gdb.
  • Add 'nguồn /usr/local/share/gdb/register_printers.gdb' trong .gdbinit bạn

(Bạn có thể chọn thư mục khác nhau)

Test:

#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 = (tăng :: mpl :: chuỗi) hello world

+0

** Làm việc như một nét duyên dáng! ** Và bây giờ tôi có thể dễ dàng làm đẹp các kiểu chữ khác bằng python bằng cách sử dụng cùng phương pháp này. Cảm ơn bạn. – etherice

+0

@etherice Vui lòng xuất bản máy in của bạn, một số ngày. –

+1

Để làm rõ một vài phần trong hướng dẫn: 'printers.py' và' mpl_printers.py' nên đi vào thư mục con 'boost' (tức là'/usr/local/share/gdb/python/boost') để mô-đun tên trong 'register_printers.gdb' là hợp lệ. Ngoài ra, thư mục con 'boost' phải chứa một tập tin' __init __. Py' (có thể trống) để python nhận ra nó là một thư mục chứa các mô-đun (nếu không, bạn sẽ nhận được một lỗi 'ImportError: No module name boost.printers') . – etherice

Các vấn đề liên quan