You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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脚本自定义类型的显示逻辑,写一个脚本就能自动把所有父类成员展开到当前层级。

  1. 创建一个名为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<*,*>')
  1. 在LLDB中加载这个脚本:
(lldb) command script import flatten_inheritance.py

之后再执行frame variable bottom -T -D1 -P1,就能得到期望的扁平化输出。

方案2:封装LLDB命令+终端过滤

如果不想写脚本,可以用LLDB的自定义命令结合终端过滤快速实现:

  1. 先定义一个简化的命令:
(lldb) command alias frame var-flatten frame variable -R -T

-R参数会递归展开所有成员,但会保留嵌套结构,接着用sed过滤掉嵌套的大括号和多余缩进:

  1. 执行命令并过滤输出:
(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:43:18