如何在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命令:
- 新建
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')
- 在LLDB中加载这个脚本:
command script import /你的脚本路径/any_printer.py
- 之后直接用自定义命令打印
std::any变量:
print-any a
输出会显示std::any<int> = 1。
内容的提问来源于stack exchange,提问作者zaijun
相关产品推荐
相关产品推荐

