2013-09-04 4 views
6

で<...>タイプIは、広範囲にboost::mpl::string<...>タイプを使用して...それは本当にデバッグとヘルプがgdbできれいに印刷の種類を持っているであろうことは十分。かなり印刷ブースト:: MPL ::文字列GDB

個人(複数文字リテラル)それは現在ありませんのような構成要素を示す

だから... ...ではなくgdb ...

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

それは...代わりに同等の文字列の値を表示するであろう

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

私はgdbgdbにpretty-printing STLコンテナのマクロとpythonスクリプトを見ましたが、かなり印刷されたboost::mplの文字列を見つけることができませんでした。誰もこれで助けることができますか?


UPDATE:私が追加した恵み...私はSTLコンテナのhere記載されているように(のpython経由プリティ印刷用の最新のGDBのサポートを利用して解決策を探しています)。ここで

答えて

7

はブースト・プリティプリンタ(https://github.com/ruediger/Boost-Pretty-Printer/wiki)を利用し、私のソリューションです:

ファイル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 

ファイル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 
  • プリンタをインストールします。 .pyと上記のmpl_printers.pyをディレクトリ に/ usr/local/share/gdb/python/boos t。
  • に/ usr/local/share上記 'register_printers.gdb' をインストールし
  • (空のファイルがそれを行います)シェア/ GDB /パイソン/ブースト/は/ usr/localで__init__.pyを持っていることを確認/ gdb。

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

    GDB:あなたの.gdbinit

(あなたが別のディレクトリを選択する場合があります)

試験における

  • 追加 'ソース/usr/local/share/gdb/register_printers.gdb'テスト-ex 'b main' -ex 'r' -ex 'ps' -ex 'c' -ex 'q

    $ 1 =(boost :: mpl :: string)hello world

  • +0

    **作品は魅力的です!**今、この同じ方法を使って、Pythonで他のタイプ名を簡単に美しくすることができます。ありがとうございました。 – etherice

    +0

    @ethericeいつかプリンタを公開してください。 –

    +1

    命令の中のいくつかの部分を明確にするために、 'printers.py'と' mpl_printers.py'は 'boost'サブディレクトリ(すなわち、'/usr/local/share/gdb/python/boost') 'register_printers.gdb'の名前は有効です。また、 'boost'サブディレクトリには' __init __。py'ファイル(空でもよい)が含まれていなければなりません。pythonはモジュールを含むディレクトリとして認識します(そうしないと、 'ImportError:No module boost.printers'というエラーが出ます) 。 – etherice

    関連する問題