给定一个对象的地址,如何在LLDB Python脚本中对其调用ObjC方法?

2024-10-04 11:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

这样称呼:

^{pr2}$

有什么想法吗?我是Python新手。我认为在SBValue的文档中有一些东西可以让我接近我想要的东西,但我看不到是否有。在


Tags: 代码脚本idgetreturnaddress方式class
2条回答

我不在电脑前(实际上是在里诺的一家餐馆:),所以下面的内容大多是粗略的,但它应该会给你指明正确的方向

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

id foo(id arg)

你能做的就是做一根绳子

“(id)foo((id)0xaddr”

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

我相信无论是SBTarget还是SBFrame EvaluateExpression方法 为此,您将传递您精心编制的字符串,并记住启用动态类型,因为您正在处理ObjC,并且很可能希望解析它们。在

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

希望这有帮助。如果你需要更多的细节请随时询问,我会尽量填补空白,因为我有机会!在

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

也许有更简单的方法(人们希望如此),但我找不到。在

相关问题 更多 >