给定一个对象的地址,我如何在LLDB Python脚本中调用它的Obj-C方法?

时间:2013-11-28 21:44:09

标签: python objective-c lldb

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

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

这样称呼:

(lldb) get_super_class(0x123abc)
UIViewController

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

2 个答案:

答案 0 :(得分:2)

我不在我的电脑里(实际上在里诺的一家餐馆:)所以接下来的大概是粗略的,但它应该指向正确的方向

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

id foo(id arg)

你能做的就是让自己成为一个字符串

“(ID)FOO((ID)0xaddr”

然后你想把它作为表达式来评估。

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

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

希望这会有所帮助。如果您需要更多详细信息,请随时提出,我会尽量填补空白!

答案 1 :(得分:1)

我不知道如何使用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()

可能有一种更简单的方法(人们希望如此),但我找不到任何方法。