如何在lldb跟踪中打印功能的所有变量?

时间:2020-07-23 15:41:33

标签: python macos lldb macos-catalina

我以此方式尝试过:

           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中内置的跟踪器中,因此在每个函数中,跟踪器将尽最大努力来解析函数参数值,并在退出时将尽最大努力来解析函数返回值。

1 个答案:

答案 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