我以此方式尝试过:
destination = thread.GetFrameAtIndex(0).GetSymbol().GetName()
# registers = thread.GetFrameAtIndex(0).GetRegisters()
for x,i in enumerate(thread.GetFrameAtIndex(0).get_arguments()):
log("arg: {0}: sum: {1} val: {2}".format(x,
i.GetSummary(),
i.GetValue()))
for x, i in enumerate(thread.GetFrameAtIndex(0).GetRegisters()):
log("reg: {0}: sum: {1} val: {2} desc: ".format(
x,
i.GetSummary(),
i.GetValue(),
i.GetObjectDescription()))
想法是获取指针的所有类型,值和内容(当lldb可以解析它们时) 因此,例如char *,string,NSString等。我除了GetSummary()/ GetObjectDescription()能够将它们解析为实际的字符串。
问题是,当我尝试跟踪thread.GetFrameAtIndex(0).get_arguments()
时总是返回空列表,而 thread.GetFrameAtIndex(0).GetRegisters()
的输出看起来像这样:
reg: 0: sum: None val: None desc:
reg: 1: sum: None val: None desc:
reg: 2: sum: None val: None desc:
我要做什么?
我的目的是将其添加到我在lldb中内置的跟踪器中,因此在每个函数中,跟踪器将尽最大努力来解析函数参数值,并在退出时将尽最大努力来解析函数返回值。
答案 0 :(得分:3)
调用GetRegisters时,返回的是一组寄存器组,GPR,浮点数以及您的计算机可能拥有的其他任何东西。寄存器组没有值或摘要-尽管确实有名称。例如,在intel上,我得到了(在脚本解释器中):
<?php
// your code for logging the request
echo <html>...</html>
?>
因此,您需要再进行一次迭代,或者,如果您只希望GPR总是在第一位,那么:
>>> for reg_group in lldb.frame.GetRegisters():
... print(reg_group.GetName())
...
General Purpose Registers
Floating Point Registers
Exception State Registers