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

2024-09-22 16:38:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着这样做:

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


Tags: in程序noneforgetvalregarguments
1条回答
网友
1楼 · 发布于 2024-09-22 16:38:08

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

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

相关问题 更多 >