如何解决如何使用lldb将数据成员char数组漂亮地打印为字符串如boost :: static_string?
我正在尝试为Boosts static_string
类模板定义自定义摘要。示例源文件:
#include <boost/static_string/static_string.hpp>
const boost::static_string<5> s{"abc"};
没有任何格式化程序,frame variable -R s
给了我
(boost::static_strings::static_string<5>) s = {
boost::static_strings::detail::static_string_base<5,char,std::__1::char_traits<char> > = {
size_ = '\x03'
data_ = {
[0] = 'a'
[1] = 'b'
[2] = 'c'
[3] = '\0'
[4] = '\0'
[5] = '\0'
}
}
}
我非常了解零终止的C字符串的内置格式,即frame variable -f s &s.data_
:
(boost::static_strings::detail::static_string_base<...>::value_type (*)[6]) &data_ = "abc"
但是尝试使用
使其自动化type summary add -x "^boost::static_strings::static_string<.+>$" --summary "${&var.data_%s}"
不起作用(也尝试"${var.&data_%s}"
)-无法分析自定义格式字符串。根据{{3}},间接*var
与特殊的var
占位符一起使用,但是&
似乎不起作用(文档中也未提及,因此是个疯狂的猜测。)
解决方法
python API可以在这里提供帮助。对于摘要字符串,可以注册一个返回所需输出的自定义python函数。此函数接受SBValue
的实例(以及一些您不应该触摸的内部字典)。示例性的boost.py
:
import lldb
def staticStringSummary(valobj,unused):
data = valobj.GetChildMemberWithName('data_')
err = lldb.SBError()
string = data.GetData().GetString(err,0)
return string
def __lldb_init_module(debugger,internalDict):
debugger.HandleCommand('type summary add -x "^boost::static_strings::static_string<.+>$" -F boost.staticStringSummary')
如果您将上述文件加载为.lldbinit
的(可能是项目本地的)
command script import path/to/boost.py
对于上面的示例,fr v
将产生
(boost::static_strings::static_string<5>) s = abc
请注意,Boost的static_string
类可确保末尾始终为零字节,从而确保此解决方案有效。不过,不确定这是否是最好的方法(我在提出问题时就想到了这一点)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。