首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 記錄詳細呼叫堆疊日誌工具函數

     編輯:更多程式設計知識

除錯複雜呼叫鏈時,需要知道完整呼叫堆疊。利用 sys._getframe() 向上遍歷框架物件,可取得檔案名、函數名、行號,組合成可讀字串。

工具函數


import sys, os

def detailtrace(info):
    ret = []
    f = sys._getframe().f_back  # 跳過 detailtrace 自身
    while f:
        co = f.f_code
        ret.append(f"{os.path.basename(co.co_filename)}({co.co_name}:{f.f_lineno})")
        f = f.f_back
    print("->".join(reversed(ret)) + "->" + info)

使用範例


def foo():
    detailtrace("hello world")

def bar():
    foo()

def main():
    bar()

if __name__ == "__main__":
    main()

輸出


aaa1.py(main:27)->aaa1.py(bar:24)->aaa1.py(foo:21)->hello world

進階:整合 logging


import logging

def log_stack(logger, level, msg):
    frames = []
    f = sys._getframe().f_back
    while f:
        co = f.f_code
        frames.append(f"{co.co_filename}:{co.co_name}:{f.f_lineno}")
        f = f.f_back
    logger.log(level, "%s\nStack:\n%s", msg, "\n".join(reversed(frames)))

注意事項

  • sys._getframe() 為 CPython 實作細節,其他實現 (PyPy, MicroPython) 可能不支援。
  • 頻繁呼叫影響效能,僅用於除錯/例外處理路徑。
  • 生產環境建議使用 traceback 模組標準化格式。

此工具快速定位「誰呼叫了誰」,是除錯利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved