如何在调用Python方法时查看/打印详细堆栈跟踪?以zipfile.extractall为例
查看Python函数调用流程与堆栈跟踪的方法(以zipfile.extractall为例)
一、用pdb交互式单步调试
pdb是Python自带的调试器,能让你逐行执行代码,深入拆解函数调用链:
- 在代码中插入调试断点:
import zipfile import pdb # 假设当前目录存在test.zip文件 with zipfile.ZipFile('test.zip', 'r') as zf: pdb.set_trace() # 触发调试器 zf.extractall()
- 进入调试器后的常用操作命令:
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模块可以批量跟踪代码执行过程,生成详细的调用日志:
- 编写脚本文件(比如命名为
test_zip.py):
import zipfile with zipfile.ZipFile('test.zip', 'r') as zf: zf.extractall()
- 在命令行执行以下命令:
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
相关产品推荐
相关产品推荐

