gpt4 book ai didi

c++ - 在 gdb 中漂亮地打印 boost::mpl::string<...> 类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:45 25 4
gpt4 key购买 nike

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

所以...而不是 gdb像当前一样显示单个(多字 rune 字)组件 ...

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

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

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

我看过 gdb gdb 中用于 pretty-print STL 容器的宏和 python 脚本, 但我找不到一个 pretty-print boost::mpl字符串。有人可以帮忙吗?


更新:我已经添加了一个+100赏金......我正在寻找一种解决方案,它利用最新的 GDB 支持通过 python 进行 pretty-print (如对 STL 容器的 here 所述)。

最佳答案

这是我使用 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/boost.
  • 确保您在/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) Hello World

关于c++ - 在 gdb 中漂亮地打印 boost::mpl::string<...> 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18604664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com