如何在LLDB中访问名称含特殊字符的合成子对象?
问题场景
我定义了如下C++结构体:
struct Foo { int field1; int field2; }; int main() { Foo foo{.field1 = -1, .field2 = -2}; return 0; }
并为Foo实现了LLDB自定义合成数据格式化器(example.py):
class Foo: def __init__(self, valobj, internal_dict): self.valobj = valobj def num_children(self): return 2 def get_child_index(self, name): match name: case "bar": return 0 case "[baz]": return 1 def get_child_at_index(self, idx): match idx: case 0: return self.bar case 1: return self.baz def update(self): self.bar = self.valobj.GetChildMemberWithName("field1").Clone("bar") self.baz = self.valobj.GetChildMemberWithName("field2").Clone("[baz]") def has_children(self): return True def __lldb_init_module(debugger, internal_dict): debugger.HandleCommand("type synthetic add Foo -l example.Foo")
格式化后foo的显示为:
(Foo) foo = (bar = -1, [baz] = -2)
我能正常访问foo.bar,但尝试多种方式都无法访问带特殊字符的[baz];同时当foo是指针类型时,连通过索引访问的临时方案也失效了。
解决方案
1. 访问带特殊字符的合成子对象
LLDB的frame variable(简写v)命令提供了两种绕过语法解析冲突的方式:
- 方式一:用
--分隔符
告诉LLDB后续内容为原始成员名,不再进行语法解析:(lldb) v foo -- [baz] (int) [baz] = -2 - 方式二:用单引号包裹成员名
强制LLDB将内容视为字面量成员名:(lldb) frame variable foo.'[baz]' (int) foo.[baz] = -2
2. 指针类型的访问方式
当foo是指针时,需要先解引用,再结合上述方法访问:
- 方式一:解引用后用
--分隔符(lldb) v *foo -- [baz] (int) [baz] = -2 - 方式二:索引访问的正确写法
用括号包裹解引用部分,配合--或单引号避免解析错误:
或:(lldb) v -- (*foo)[1] (int) [baz] = -2(lldb) frame variable '(*foo)[1]' (int) (*foo)[1] = -2 - 方式三:临时引用中转
先将指针解引用赋值给临时引用,再直接访问:(lldb) expr Foo &foo_ref = *foo (lldb) v foo_ref.[baz]
内容的提问来源于stack exchange,提问作者Sam Estep
相关产品推荐
相关产品推荐

