2010年4月3日 星期六

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, 這作法真是太妙了, 相當地簡單易懂。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...