Python 如何在lldb跟踪中打印函数的所有变量?

Python 如何在lldb跟踪中打印函数的所有变量?,python,macos,lldb,macos-catalina,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()):

我试着这样做:

           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()能够将它们解析为实际的字符串之外,其他都是I

问题是当我尝试跟踪
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中构建的跟踪程序中,所以在每个函数中,跟踪程序都会尽最大努力解析函数参数值,在退出时,它会尽最大努力解析函数返回值。

调用GetRegisters时,返回的是一个寄存器组数组,GPR,浮点和您的机器可能拥有的任何其他功能。寄存器组没有值或摘要-尽管有名称。例如,在intel上,我(在脚本解释器中)得到:

因此,您需要再进行一次迭代,或者如果您只想获得GPR的,则它们始终是第一位的,因此:

>>> for reg in lldb.frame.GetRegisters()[0]:
...     print(reg)
... 
(unsigned long) rax = 0x0000000100003f50
(unsigned long) rbx = 0x0000000000000000
(unsigned long) rcx = 0x00007ffeefbff768

当您调用GetRegisters时,返回的是一个寄存器组数组、GPR、浮点以及您的机器可能拥有的任何其他内容。寄存器组没有值或摘要-尽管有名称。例如,在intel上,我(在脚本解释器中)得到:

因此,您需要再进行一次迭代,或者如果您只想获得GPR的,则它们始终是第一位的,因此:

>>> for reg in lldb.frame.GetRegisters()[0]:
...     print(reg)
... 
(unsigned long) rax = 0x0000000100003f50
(unsigned long) rbx = 0x0000000000000000
(unsigned long) rcx = 0x00007ffeefbff768

谢谢,那么get_参数()呢?为什么总是空的?你在一个有调试信息的框架中吗?参数是指调试信息中的参数。在没有调试信息的任何帧中,它都将为空。不,我正在寻找在跟踪函数参数和函数返回值期间自动打印的方法,如何才能做到这一点?(仅仅使用po或p并没有达到目的,我需要一些东西,当lldb知道函数的签名时,他会自动从寄存器中提取参数并记录它们,而不知道函数的签名,你无法知道它的参数在哪里。它们可能在GPR、FPR或堆栈上。如果lldb有调试通知对于函数,get_参数将打印它们。如果您在函数中停止,然后在函数停止时使用SBThread.StepOut。GetStopReturnValue将为您提供该函数的返回值。但是如果该函数没有调试信息,则lldb再次无法知道这可能是什么。谢谢,get_参数()?为什么总是空的?您是否在包含调试信息的框架中?参数是指来自调试信息的参数。在没有调试信息的任何框架中,它都将为空。不,我正在寻找在跟踪函数参数和函数返回值的过程中自动打印的方法,我如何才能做到这一点?(仅仅使用po或p并没有达到目的,我需要一些东西,当lldb知道函数的签名时,他会自动从寄存器中提取参数并记录它们,而不知道函数的签名,你无法知道它的参数在哪里。它们可能在GPR、FPR或堆栈上。如果lldb有调试通知对于函数,get_参数将打印它们。如果您在函数中停止,然后在函数停止时使用SBThread.StepOut。GetStopReturnValue将为您提供该函数的返回值。但是如果函数没有调试信息,则lldb也无法知道这可能是什么。