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

如何在LLDB中打印std::any类型的具体数值?

在LLDB中打印std::any的具体数值

先看场景:
示例代码:

std::any a = 1;

在LLDB执行p a后得到输出:

(lldb) p a
(std::any) $1 = {
  __h = 0x000000010000d200 (main`std::__1::__any_imp::_SmallHandler<int>::__handle(std::__1::__any_imp::_Action, std::__1::any const*, std::__1::any*, std::type_info const*, void const*) at any:350)
  __s = {
    __ptr = 0x0000000000000001
    __buf = (__lx = "\U00000001")
  }
}

直接执行std::any_cast<int>(a)会失败,下面是两种可行的打印方法:

方法一:直接访问内部成员(适用于libc++实现)

LLDB输出里能看到,libc++的std::any对小类型(比如int)用了小对象优化,值直接存在__s.__ptr或者__s.__buf中。直接执行以下命令就能打印:

# 直接打印__ptr的数值,这里就是1
p a.__s.__ptr
# 或者强制转换类型,确保输出是int类型
p *(int*)&a.__s.__ptr

执行后会得到类似(int) $2 = 1的结果。

方法二:自定义LLDB命令(通用便捷版)

如果不想每次都手动敲内部成员,可以写个简单的Python脚本自定义LLDB命令:

  1. 新建any_printer.py脚本,内容如下:
import lldb
import re

def print_any_value(debugger, command, result, internal_dict):
    frame = debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
    any_var = frame.FindVariable(command)
    if not any_var.IsValid():
        print(f"找不到变量 {command}", file=result)
        return
    
    # 从handler符号提取存储的类型
    handler = any_var.GetChildMemberWithName("__h")
    handler_addr = handler.GetValueAsUnsigned()
    symbol = debugger.GetSelectedTarget().ResolveLoadAddress(handler_addr).GetSymbol()
    symbol_name = symbol.GetName()
    
    type_match = re.search(r"_SmallHandler<([^>]+)>", symbol_name)
    if not type_match:
        print("无法解析std::any存储的类型", file=result)
        return
    
    target_type = type_match.group(1)
    # 取出存储的值并转换类型打印
    s_member = any_var.GetChildMemberWithName("__s")
    ptr_val = s_member.GetChildMemberWithName("__ptr").GetValueAsUnsigned()
    eval_result = frame.EvaluateExpression(f"*({target_type}*){ptr_val}")
    print(f"std::any<{target_type}> = {eval_result.GetValue()}", file=result)

def __lldb_init_module(debugger, internal_dict):
    debugger.HandleCommand('command script add -f any_printer.print_any_value print-any')
  1. 在LLDB中加载这个脚本:
command script import /你的脚本路径/any_printer.py
  1. 之后直接用自定义命令打印std::any变量:
print-any a

输出会显示std::any<int> = 1。

内容的提问来源于stack exchange,提问作者zaijun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:25:30