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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:18:18