以下是我的解决方案,使用了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
import sys
sys.path.insert(0, '/usr/local/share/gdb/python')
from boost.printers import register_boost_printers
from boost.mpl_printers import register_boost_mpl_printers
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 文件(一个空文件就够了)。
- 将上述的 register_printers.gdb 安装在 /usr/local/share/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 Test -ex 'b main' -ex 'r' -ex 'p s' -ex 'c' -ex 'q'
$1 = (boost::mpl::string) 你好世界
printers.py
和mpl_printers.py
应该放在一个名为boost
的子目录下(即/usr/local/share/gdb/python/boost
),这样register_printers.gdb
中的模块名称才是有效的。此外,boost
子目录必须包含一个__init__.py
文件(可以为空),以便Python将其识别为包含模块的目录(否则,您将收到ImportError: No module named boost.printers
错误)。 - etherice