Jupyter Notebook中pdb调试器触发‘跳过隐藏帧’的原因及解决方法
Jupyter Notebook中breakpoint()调试跳转到IPython代码的解决方法
问题描述
在Jupyter Notebook单元格中执行以下代码:
a=1 b=1 breakpoint() c=1 d=1
触发ipdb调试后,输入n单步执行时,多次出现[... skipped 1 hidden frame]提示,且跳转到IPython的interactiveshell.py代码,而非预期执行c=1。
解决方法
1. 使用IPython魔法命令%debug替代直接breakpoint
- 先移除代码中的
breakpoint(),运行单元格代码 - 在新的单元格中输入
%debug,进入调试会话 - 输入
b 3(对应你要调试的代码行号,这里是c=1所在行)设置断点 - 输入
run重新执行代码,此时会在你设置的断点处暂停,后续用n就能正常步进自己的代码
2. 配置ipdb显示所有栈帧
- 临时生效:进入ipdb调试会话后,输入命令
set nohidden,此时会显示所有调用栈帧,再用u(向上切换栈帧)回到自己的代码栈,之后用n就能正常步进 - 永久生效:
- 方式一:替换代码中的
breakpoint()为:import ipdb ipdb.set_trace(nohidden=True) - 方式二:设置环境变量
PYTHONBREAKPOINT="ipdb.set_trace(nohidden=True)",之后直接用breakpoint()就会默认开启nohidden模式
- 方式一:替换代码中的
3. 使用Jupyter可视化调试工具
新版Jupyter Lab/Notebook内置了可视化调试面板:
- 在左侧边栏打开调试器(Debugger)选项
- 直接在代码行号左侧点击添加断点
- 点击调试按钮启动调试,可通过面板的步进按钮控制执行,完全避免命令行调试的栈帧跳转问题
原因说明
Jupyter执行单元格代码时,会通过IPython的InteractiveShell进行包装执行,调试器默认会跳过这些框架代码,但实际执行时仍可能进入这些隐藏栈帧。开启nohidden或使用魔法命令/可视化调试,能绕开IPython的包装层,聚焦在用户代码上。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

