如何在 lldb 跟踪中打印函数的所有变量?
How can I print all variable of function in lldb trace?
我这样试过:
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()
总是 return 空列表时 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 中构建的调用跟踪器,因此在每个函数中,跟踪器将尽力解析函数参数值,并在退出时尽最大努力解析函数 return值。
当您调用 GetRegisters 时,您返回的是一组寄存器组、GPR、浮点数以及您的机器可能拥有的任何其他内容。寄存器组没有值或摘要——尽管它们有名称。因此,例如在英特尔上,我得到(在脚本解释器中):
>>> for reg_group in lldb.frame.GetRegisters():
... print(reg_group.GetName())
...
General Purpose Registers
Floating Point Registers
Exception State Registers
所以你需要再迭代一次,或者如果你只想要 GPR,它们总是第一个,所以:
>>> for reg in lldb.frame.GetRegisters()[0]:
... print(reg)
...
(unsigned long) rax = 0x0000000100003f50
(unsigned long) rbx = 0x0000000000000000
(unsigned long) rcx = 0x00007ffeefbff768
我这样试过:
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()
总是 return 空列表时 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 中构建的调用跟踪器,因此在每个函数中,跟踪器将尽力解析函数参数值,并在退出时尽最大努力解析函数 return值。
当您调用 GetRegisters 时,您返回的是一组寄存器组、GPR、浮点数以及您的机器可能拥有的任何其他内容。寄存器组没有值或摘要——尽管它们有名称。因此,例如在英特尔上,我得到(在脚本解释器中):
>>> for reg_group in lldb.frame.GetRegisters():
... print(reg_group.GetName())
...
General Purpose Registers
Floating Point Registers
Exception State Registers
所以你需要再迭代一次,或者如果你只想要 GPR,它们总是第一个,所以:
>>> for reg in lldb.frame.GetRegisters()[0]:
... print(reg)
...
(unsigned long) rax = 0x0000000100003f50
(unsigned long) rbx = 0x0000000000000000
(unsigned long) rcx = 0x00007ffeefbff768