c – gdb中的漂亮打印boost :: mpl :: string <...>类型

我使用boost :: mpl :: string< ...>广泛的类型…足以使调试真正有助于在gdb中打印漂亮的类型.

所以…而不是gdb显示像目前那样的单个(多字符文字)组件……

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

它会显示等效的字符串值而不是……

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

我已经看到gdb宏和python脚本在gdb中漂亮地打印STL容器,但我找不到一个用于漂亮打印boost :: mpl字符串.有人能帮忙吗?

更新:我已经添加了100个赏金……我正在寻找一种解决方案,利用最新的GDB支持通过python进行漂亮打印(如here为STL容器所述).

最佳答案
这是我使用Boost-Pretty-Printer(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

>在目录中安装printers.py和上面的mpl_printers.py
在/usr/local / share下/ GDB /Python/升压.
>确保在/usr/local / share / gdb / python / boost中有一个__init__.py(一个空文件就可以了)
>安装以上内容
/usr/local / share / gdb中的’register_printers.gdb’.
>在.gdbinit中添加’source /usr/local/share/gdb/register_printers.gdb’

(您可以选择不同的目录)

测试:

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

gdb测试-ex’b main’-ex’r’-ex’p s’-ex’c’-ex’q’

$1 =(boost :: mpl :: string)你好世界

转载注明原文:c – gdb中的漂亮打印boost :: mpl :: string <...>类型 - 代码日志