【问题标题】:Given the address of an object, how would I call Obj-C methods on it in an LLDB Python script?给定对象的地址,我将如何在 LLDB Python 脚本中对其调用 Obj-C 方法?
【发布时间】:2013-12-15 00:33:37
【问题描述】:

在伪代码中,我想创建一个可重复使用的 LLDB Python 脚本,其工作原理如下:

get_super_class(int address) {
    return ((id)address).getSuperClass();
}

这样称呼:

(lldb) get_super_class(0x123abc)
UIViewController

有什么想法吗?我是python新手。我认为SBValue 的文档中有一些内容可以让我接近我想要的,但如果有的话我看不到。

【问题讨论】:

    标签: python objective-c lldb


    【解决方案1】:

    我不在电脑前(实际上是在 Reno 的一家餐厅 :),所以接下来的内容大多是粗略的,但它应该为您指明正确的方向

    您要做的是将表达式组合为字符串。假设您正在寻找 foo(X) ,其中 foo 被定义为

    id foo(id arg)

    你能做的就是把自己变成一个字符串

    "(id)foo((id)0xaddr"

    然后你想把它作为一个表达式来计算。

    我相信 SBTarget 或 SBFrame 都有 EvaluateExpression 方法 为此,您传递您尽职尽责的字符串,并记住启用动态类型,因为您正在处理 ObjC 并且很可能希望它们被解析。

    该 API 将返回另一个 SBValue。您可以查询值、摘要、描述,也可以获取其子值等。

    希望这会有所帮助。如果您需要更多详细信息,请随时询问,我会在有机会时尝试填补空白!

    【讨论】:

    • 就是这样!我使用的行是这样的:debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetFrameAtIndex(0).EvaluateExpression('((id)0x8b464a0)') 它为您传入的任何地址返回一个有效的 SBValue 对象。
    • 注意,对于没有特定于帧的信息的表达式,您可以使用 SBTarget::EvaluateExpression() 代替特定于帧的信息。它没有太大区别,只是在框架的上下文中对其进行评估会将 SBValue 的生命周期固定到该线程和框架,您可能想要也可能不想要。
    【解决方案2】:

    我不知道如何使用SBValue,但您可以使用SBCommandInterpreter 使用 lldb 运行命令并捕获其输出:

    # First, get the command interpreter:
    ci = lldb.debugger.GetCommandInterpreter()
    # Then create an `SBCommandReturnObject` to capture the output
    output = lldb.SBCommandReturnObject()
    # run an lldb command to get the superclass
    ci.HandleCommand("po [" + address + " superclass]", output)
    # get the output and strip the trailing line break
    superclass = output.GetOutput().rstrip()
    

    可能有更简单的方法(希望如此),但我找不到。

    【讨论】:

    • 很好的答案,但不是我需要的。我返回超类的示例是一种简化,这就是为什么我更喜欢使用实际对象而不是调用 LLDB 命令行的原因。我可能会做出与您的答案类似的事情,但最终会变得很笨拙。
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 2020-08-22
    • 2018-01-04
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多