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也无法知道这可能是什么。