如何在 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