LLDB Python脚本:XCode中创建变量传递引用参数的方法咨询
问题描述
我在XCode中使用LLDB的Python脚本支持,为复杂C++类类型添加自定义变量格式化。简单场景下运行正常,但调用**引用传递参数(用于填充结果)**的方法时遇到问题——需要创建一个变量来传递参数,但找不到可行的实现方式。
我尝试用target的CreateValueFromData方法,代码如下,但无法正常工作:
import lldb def MyClass(valobj, internal_dict): class2_type = valobj.target.FindFirstType('class2') process = valobj.process class2Data = [0] data = lldb.SBData.CreateDataFromUInt32Array(process.GetByteOrder(), process.GetAddressByteSize(), class2Data) valobj.target.CreateValueFromData("testClass2", data, class2_type) valobj.EvaluateExpression("getType(testClass2)") class2Val = valobj.frame.FindVariable("testClass2") if not class2Val.error.success: return class2Val.error.description return class2Val.GetValueAsUnsigned()
请问是否有可行的方法实现需求?
解决方案
问题出在你用target.CreateValueFromData创建的是目标全局范围的变量,而EvaluateExpression默认在当前栈帧的作用域执行,找不到这个全局变量。正确的做法是在当前栈帧上创建局部变量,或者直接通过表达式生成可用于引用传递的对象。
方法1:通过表达式创建栈上变量并调用方法
直接用SBFrame.EvaluateExpression在当前栈帧中构造class2对象,它会存在于当前栈作用域内,后续调用方法时可直接引用:
import lldb def MyClass(valobj, internal_dict): frame = valobj.frame # 在当前栈帧创建class2类型的局部变量testClass2 expr_result = frame.EvaluateExpression("class2 testClass2;") if not expr_result.error.success: return expr_result.error.description # 调用getType方法,传入testClass2的引用 call_result = frame.EvaluateExpression("getType(testClass2)") if not call_result.error.success: return call_result.error.description # 获取填充后的testClass2的值 class2Val = frame.FindVariable("testClass2") if not class2Val.error.success: return class2Val.error.description return class2Val.GetValueAsUnsigned()
方法2:堆上分配对象(适合精细控制场景)
如果栈空间不足,可在堆上分配对象,用完后手动清理:
import lldb def MyClass(valobj, internal_dict): target = valobj.target frame = valobj.frame class2_type = target.FindFirstType('class2') # 在堆上分配并构造class2对象 alloc_expr = frame.EvaluateExpression("new class2()") if not alloc_expr.error.success: return alloc_expr.error.description # 调用getType方法,传入堆对象的引用 call_result = frame.EvaluateExpression(f"getType(*({class2_type.GetName()}*){alloc_expr.GetValueAsUnsigned()})") if not call_result.error.success: frame.EvaluateExpression(f"delete ({class2_type.GetName()}*){alloc_expr.GetValueAsUnsigned()}") return call_result.error.description # 获取填充后的对象值 class2Val = alloc_expr.Dereference() result_val = class2Val.GetValueAsUnsigned() # 释放堆内存 frame.EvaluateExpression(f"delete ({class2_type.GetName()}*){alloc_expr.GetValueAsUnsigned()}") return result_val
关键说明
SBFrame.EvaluateExpression创建的变量属于当前栈帧,作用域匹配,后续查找或调用都能正常访问。- 只要
getType的方法签名是void getType(class2&),直接传递变量名就会自动以引用方式传入。
内容的提问来源于stack exchange,提问作者Jasongiss
相关产品推荐
相关产品推荐

