Python 取出 call stack 的方法

雖然明白 interpreter 有記錄每個模組內每個物件所在的行數, 也會在執行期間記住每行程式的執行順序, 卻不清楚要怎麼自己取出這些資訊?

剛才順著 django-debug-toolbar 的程式一路往下追, 看到它用 traceback.extract_stack() 取出 call stack, 於是就看了一下這函式的內容:
def extract_stack(f=None, limit = None):
    # ... 中略 ...
    if f is None:
        try:
            raise ZeroDivisionError
        except ZeroDivisionError:
            f = sys.exc_info()[2].tb_frame.f_back
    # ... 中略 ...
    while f is not None and (limit is None or n < limit):
        lineno = f.f_lineno
        # ... 中略 ...
        list.append((filename, lineno, name, line))
        f = f.f_back
        n = n+1
    list.reverse()
    return list
自己丟 Exception 再抓回取出 call stack, 這作法真是太妙了, 相當地簡單易懂。

留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置