跟踪python的调用堆栈地址

问题描述 投票:0回答:1

要跟踪完整的通话记录,也称为'F_BACK'

这是我的代码:

import sys
def trace_calls(frame, event, arg):
    if event != 'call':
        return
    co = frame.f_code
    func_name = co.co_name
    if func_name == 'write':
        return

    caller = frame.f_back

    print ('TRACE\t%s\tF_BACK\t%s' % (caller, frame))
    return

sys.settrace(trace_calls)

def a():                                                                                                                                                                                                                                                                       
    print("i am A")                                                                                                                                                                                                                                              

def b():
    print("i am B")                                                                                                                                                                                                                                               

if __name__ == '__main__':
    sys.settrace(trace_calls)
    a()
    b()

输出:

>TRACE   <frame at 0x7f3c14a80650, file '/tmp/test1.py', line 40, code <module>> F_BACK  <frame at 0x5587b0ee4050, file '/tmp/test1.py', line 21, code a>
>i am A
>TRACE   <frame at 0x7f3c14a80650, file '/tmp/test1.py', line 41, code <module>> F_BACK  <frame at 0x5587b0ec3da0, file '/tmp/test1.py', line 24, code b>
>i am B
>TRACE   <frame at 0x5587b0ec3da0, file '/tmp/test1.py', line 26, code b>        F_BACK  <frame at 0x5587b0ee4050, file '/tmp/test1.py', line 21, code a>
>i am A
  1. 我的理解是ID是堆栈帧的内存地址吗?
  2. if(1。),为什么我从函数a()的2次调用中得到相同的地址?
  3. 通过许多测试,ID更有可能是功能的入口,这就是为什么它是固定的。我如何获得框架的地址/标识符?

谢谢。

python stack-trace
1个回答
0
投票

Python函数不会将C堆栈用于其数据。调用函数时,python创建一个执行框架对象来保存该调用的本地数据。在您的示例中,a()在调用时创建一个框架对象,这是保存对print的第一次调用的框架。 a返回,该帧被释放并返回到堆。下一个调用b()也创建了一个框架对象,它恰好是在上一行中刚刚释放的那个。它的打印有一个新框架,该框架恰好重用了先前释放的框架的内存。

© www.soinside.com 2019 - 2024. All rights reserved.