如何在LLDB中将所有继承的数据成员显示在同一层级
LLDB如何将多层继承的父类成员展开到同一层级显示?
我在使用LLDB的frame variable命令时,遇到了多层继承对象的显示问题:父类成员默认会以折叠嵌套的形式呈现,就算用-T -D1 -P1参数,父类也只会显示成{...},无法直接看到所有层级的成员。
比如调试以下代码:
struct Top { int t; Top():t(123) {} }; struct Middle : public Top { int m; Middle():m(456){} }; struct Bottom : public Middle { int b; Bottom():b(789){} }; int main(int argc, char *argv[]) { Bottom bottom; return 0; }
在return 0处打断点后,执行frame variable bottom -T -D1 -P1得到的输出是:
(Bottom) bottom = { (Middle) Middle ={...} (int) b = 789 }
我想要的是直接把所有父类成员展开到同一层级,不需要手动调整-D参数(层级多了改参数太麻烦),也因为各种原因没法用-F选项,期望输出如下:
(Bottom) bottom = { (int) t = 123 (int) m = 456 (int) b = 789 }
下面是两个可行的解决方案:
方案1:自定义Python类型格式化脚本
LLDB支持通过Python脚本自定义类型的显示逻辑,写一个脚本就能自动把所有父类成员展开到当前层级。
- 创建一个名为
flatten_inheritance.py的脚本:
import lldb def flatten_summary(valobj, internal_dict): children = [] # 递归遍历所有父类和成员 def traverse_members(obj): for child in obj: if child.IsBaseClass(): traverse_members(child) else: children.append(f" ({child.GetTypeName()}) {child.GetName()} = {child.GetValue()}") traverse_members(valobj) # 拼接成目标格式 return f"({valobj.GetTypeName()}) = {{\n" + "\n".join(children) + "\n}" def __lldb_init_module(debugger, internal_dict): # 给目标类型注册自定义显示逻辑,这里以Bottom为例 debugger.HandleCommand('type summary add -F flatten_inheritance.flatten_summary Bottom') # 如果要对所有结构体生效,改用通配符: # debugger.HandleCommand('type summary add -F flatten_inheritance.flatten_summary struct.*') # 针对Qt的QMapNode可以单独注册: # debugger.HandleCommand('type summary add -F flatten_inheritance.flatten_summary QMapNode<*,*>')
- 在LLDB中加载这个脚本:
(lldb) command script import flatten_inheritance.py
之后再执行frame variable bottom -T -D1 -P1,就能得到期望的扁平化输出。
方案2:封装LLDB命令+终端过滤
如果不想写脚本,可以用LLDB的自定义命令结合终端过滤快速实现:
- 先定义一个简化的命令:
(lldb) command alias frame var-flatten frame variable -R -T
-R参数会递归展开所有成员,但会保留嵌套结构,接着用sed过滤掉嵌套的大括号和多余缩进:
- 执行命令并过滤输出:
(lldb) frame var-flatten bottom | sed '/{/d' | sed '/}/d' | sed 's/^ //'
得到的输出如下:
(Bottom) bottom (int) t = 123 (int) m = 456 (int) b = 789
这个方法虽然格式和原始输出不完全一致,但能快速查看所有成员,适合临时使用。
内容的提问来源于stack exchange,提问作者Rochus
相关产品推荐
相关产品推荐

