在伪代码中,我想创建一个可重用的LLDB Python脚本,其工作原理如下:
get_super_class(int address) {
return ((id)address).getSuperClass();
}
这样称呼:
(lldb) get_super_class(0x123abc)
UIViewController
有什么想法吗?我是一个python新手。我认为SBValue的文档中有一些内容可以让我接近我想要的内容,但是如果有的话我就不会看到它。
答案 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()
可能有一种更简单的方法(人们希望如此),但我找不到任何方法。