You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在调用Python方法时查看/打印详细堆栈跟踪?以zipfile.extractall为例

查看Python函数调用流程与堆栈跟踪的方法(以zipfile.extractall为例)

一、用pdb交互式单步调试

pdb是Python自带的调试器,能让你逐行执行代码,深入拆解函数调用链:

  1. 在代码中插入调试断点:
import zipfile
import pdb

# 假设当前目录存在test.zip文件
with zipfile.ZipFile('test.zip', 'r') as zf:
    pdb.set_trace()  # 触发调试器
    zf.extractall()
  1. 进入调试器后的常用操作命令:
  • s(step):单步进入当前行调用的函数,输入后会直接进入extractall内部逻辑
  • n(next):执行当前行但不进入函数,直接跳到下一行
  • bt(backtrace):打印当前完整调用堆栈,能看到从主程序到当前函数的所有调用层级
  • l(list):查看当前行附近的代码片段
  • q(quit):退出调试器

比如进入extractall后,继续输入s会进入它调用的_extract_member函数,再重复操作就能看到后续调用的_sanitize_windows_name、os.makedirs等底层函数。

二、用sys.settrace自定义调用跟踪

如果想自动打印所有被调用的函数及其堆栈信息,可以通过sys.settrace设置跟踪函数:

import zipfile
import sys
import traceback

def trace_function(frame, event, arg):
    # 只跟踪函数调用事件
    if event == 'call':
        func_name = frame.f_code.co_name
        print(f"\n=== 调用函数: {func_name} ===")
        # 打印当前调用堆栈
        traceback.print_stack(frame)
    return trace_function

# 启用全局跟踪
sys.settrace(trace_function)

with zipfile.ZipFile('test.zip', 'r') as zf:
    zf.extractall()

运行这段代码后,会自动输出extractall触发的每一层函数调用,包括_extract_member、_sanitize_windows_name、os.path.exists等,以及对应的堆栈层级信息。

三、用trace模块生成完整调用报告

Python的trace模块可以批量跟踪代码执行过程,生成详细的调用日志:

  1. 编写脚本文件(比如命名为test_zip.py):
import zipfile

with zipfile.ZipFile('test.zip', 'r') as zf:
    zf.extractall()
  1. 在命令行执行以下命令:
python -m trace --trace test_zip.py

该命令会逐行打印代码执行过程,包括每个函数的调用和返回动作,你能清晰看到extractall触发的完整调用链,示例输出片段:

--- modulename: zipfile, funcname: extractall
zipfile.py(1643):         members = self.infolist()
zipfile.py(1644):         for zipinfo in members:
zipfile.py(1645):             self._extract_member(zipinfo, path, pwd)
--- modulename: zipfile, funcname: _extract_member
zipfile.py(1706):         if not isinstance(zipinfo, ZipInfo):
...

内容的提问来源于stack exchange,提问作者jacobishere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:27:22