Python顯示函式呼叫堆疊

2021-07-05 21:24:46 字數 1472 閱讀 1857

網上找到如下幾個思路:

1、用inspect模組

2、用sys._getframe模組

3、用sys.exc_traceback,先拋乙個異常,然後抓出traceback

#

!/usr/bin/env python

#-*- coding: utf-8 -*-

import

sysdef test(depth =0):

frame =sys._getframe(depth)

code =frame.f_code

print

"frame depth =

", depth

print

"func name =

", code.co_name

print

"func filename =

", code.co_filename

print

"func lineno =

", code.co_firstlineno

print

"func locals =

", frame.f_locals

defmain():

test(0)

print

"--------

"test(1)

if__name__ == "

__main__":

main()

import

inspect

class

a:

defa(self):

print("

a.a()")

b().b()

class

b:

defb(self):

print("

b.b()")

stack =inspect.stack()

the_class = stack[1][0].f_locals["

self

"].__class__

the_method = stack[1][0].f_code.co_name

print("

i was called by {}.{}()

".format(str(the_class), the_method))

a().a()

def

currentframe():

"""return the frame object for the caller's stack frame.

"""try

:

raise

exception

except

:

return sys.exc_traceback.tb_frame.f_back

更多資訊可參考:

函式呼叫堆疊

一 函式呼叫堆疊 認真體會每一行指令位址!include intsum int a,int b mov ebp,esp 讓esp回退到ebp的位置,回退棧幀的過程中,沒有對棧幀中的值進行清0的操作 pop ebp 出棧並把出棧的值賦給ebp int main 下圖為上面示例函式,程式在sum函式中,...

函式呼叫堆疊

一 棧 1 傳統的棧 被定義為乙個特殊的容器,使用者可以將資料壓入棧中,也可以將壓入 棧中的資料彈出,但必須遵守一條規則 先進後出。2 計算機系統中的棧 是乙個有以上屬性的動態記憶體區域,壓棧操作使得棧增大,彈出操作使棧減小。棧通常是向下增長的。3 最重要的是棧儲存了乙個函式呼叫所需的維護資訊,這通...

函式呼叫堆疊

乙個函式的執行在棧上開闢記憶體。在函式呼叫時,第乙個進棧的是主函式呼叫語句的下一條可執行語句的位址,然後是函式的各個引數。在大多編譯器中,引數是由右往左入棧的,然後再是函式中的區域性變數。下面給乙個例項 int sum int a,int b int main 其中,main函式的反彙編指令 其中,...