【发布时间】:2014-10-29 05:23:02
【问题描述】:
我有一个自定义类MyNameSpace::String,为此我在 lldb 中创建了一个摘要。例如,对于MyNameSpace::String myString="a string",这里是 lldb 中的摘要:
frame variable myString
(MyNameSpace::String) myString = "a string"
我怎样才能获得看起来像 std::vector<std::string>vec 的摘要的 std::vector<MyNameSpace::String>vecString 的摘要?
到目前为止,这里是命令 frame variable 对不同变量的结果:
-
标准字符串向量
frame variable vec (std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >) vec = size=3 { [0] = "bonjour" [1] = "je suis" [2] = "vincent" } -
我的自定义字符串的向量
frame variable vecString (std::__1::vector< MyNameSpace::String, std::__1::allocator< MyNameSpace::String> >) vecString = size=2 { [0] = { value = 7453010373645639777 } [1] = { value = 18302628889929726940 } }
如何让我的自定义摘要应用于我的矢量元素?
非常感谢您的帮助。
V.
编辑:回应评论
我正在使用 lldb-310.2.37。
我使用脚本为我的 String 类创建了摘要:
def generic_summary(valueObject,dict):
name=valueObject.GetName()
return valueObject.GetFrame().EvaluateExpression(name+".toString().toStdString()").GetSummary()
debugger.HandleCommand('type summary add MyNameSpace::String -F CustomSummaries.generic_summary')
这与 ~/.lldbinit 中的正确命令一起使用。
frame variable -T vecString:
(lldb) frame variable -T vecString
(std::__1::vector<MyNameSpace::String, std::__1::allocator< MyNameSpace::String> >) vecString = size=2 {
(MyNameSpace::String) [0] = {
(MyNameSpace::uint8) value = 7453010373645639777
}
(MyNameSpace::String) [1] = {
(MyNameSpace::uint8) value = 18302628889929726844
}
}
【问题讨论】:
-
这应该可以,毕竟 std::string 的摘要字符串是 lldb 如何在标准字符串示例的向量中生成字符串的。您能否向您展示“类型格式添加”命令,并使用 -T 标志运行“帧变量”命令 - 如果我们可以看到 lldb 认为元素的类型是什么,它可能有助于了解为什么类型名匹配不是为你工作。另外你使用的是什么版本的lldb,也许这只是一个已经修复的错误?
-
我认为问题出在我的摘要脚本上。实际上,在 EvaluateExpression 中,我们使用 GetName() 返回的“名称”。它对单个字符串正常工作,因为 GetName() 返回我们可以应用我们的方法的对象的名称。但是在向量中,GetName() 为第一个元素返回“[0]”,但我们需要它返回“vectorName[0]”才能应用我们的方法......我们如何访问 SBValue 父名称,如果我们封装了多个容器,更好的是完整的名称?
-
这里是来自 valueObject.GetFrame().EvaluateExpression(name+".toString().toStdString()") 在向量内的错误代码:
-
啊,是的。这实际上是一个非常棘手的问题,因为对于像 std::vector 这样的容器类,变量的“子代”可能是“合成子代”,它们的名称实际上更多是出于显示目的,并且可能无法返回到有效的表达式。如果您需要调用一个函数,您最好的选择可能是获取您收到的 SBValue 的地址并在您的表达式中使用该地址 - 适当地转换为您的类型。
-
@JimIngham:获取地址可能会奏效——但这也有点棘手。它通常对 Objective-C 对象更有效,因为您可以将指针值转换为 id 并调用任何选择器;对于 C++ 对象,您仍然需要处理潜在的复杂类型转换来制作合理的表达式