【问题标题】:How can I print all variable of function in lldb trace?如何在 lldb 跟踪中打印所有函数变量?
【发布时间】:2020-11-13 09:41:23
【问题描述】:

我试过这样:

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

【问题讨论】:

    标签: python macos lldb macos-catalina


    【解决方案1】:

    当您调用 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
    

    【讨论】:

    • 谢谢,get_arguments() 呢?为什么总是空的?
    • 您是否在包含调试信息的框架中?参数表示来自调试信息的参数。在没有调试信息的任何帧中它将为空。
    • 不,我正在寻找在跟踪函数参数和函数返回值期间自动打印的方式,我该怎么做? (仅使用 po 或 p 并没有成功,我需要一些东西,当 lldb 知道函数的签名时,他会自动从寄存器中提取参数并记录它们
    • 如果不知道函数的签名,您就无法知道它的参数在哪里。它们可能在 GPR、FPR 或堆栈中。如果 lldb 有函数的调试信息,get_arguments 将打印它们。如果您在一个函数中停止,然后使用 SBThread.StepOut,当它停止时,SBThread.GetStopReturnValue 将为您提供该函数的返回值。但是如果函数没有调试信息,那么 lldb 又无法知道这可能是什么。
    猜你喜欢
    • 2020-07-05
    • 2017-04-16
    • 2013-03-26
    • 1970-01-01
    • 2012-05-26
    • 2019-06-15
    • 2016-07-10
    • 2016-07-06
    • 2015-10-03
    相关资源
    最近更新 更多