手动单步调试正常,无断点运行卡顿,如何定位程序执行位置?
问题描述
我有一段存在问题的代码,开头和结尾都加了print语句,还在这两处设了断点:
print("starting problematic section") # <-- breakpoint set here # various calls # <--- program hangs somewhere here if not manually stepping through print("done.") # <-- breakpoint set here
现象:用调试器手动单步调试时,程序运行正常,能触发开头和结尾的print语句;但移除断点、不手动单步调试时,程序会卡顿。
需求:在不设置断点、不手动单步的情况下实现两个目标:
- 让编辑器自动跳转到程序当前执行对应的源码位置
- 查看实时更新的调用栈
曾考虑给每一行源码设置logpoint,但过于耗时不可行,寻求可行方法。
可行解决方案
- 利用调试器的即时暂停功能:主流编辑器(VS Code、PyCharm)的调试面板都有「暂停」按钮。当程序卡顿无响应时,点击这个按钮,调试器会立刻暂停程序执行,自动跳转到当前正在运行的代码行,同时在调试面板展示完整的调用栈。这个操作不需要提前设置任何断点,完全是按需触发。
- 启用采样式性能分析器:
- VS Code:通过Python插件的「Run with Profiler」启动程序,采样分析器会定期记录程序的执行位置,卡顿期间的热点代码会被标记出来,同时可以实时查看调用栈快照。
- PyCharm:开启「Sampling Profiler」,程序运行时会自动采样执行状态,即使在卡顿过程中,也能查看实时的调用栈信息,卡顿结束后还能生成详细的性能报告定位问题。
- 动态信号触发调试断点:在代码开头添加一段信号处理逻辑,不需要提前设断点,程序卡顿时手动发送信号触发调试:
运行程序后,当它开始卡顿,在终端执行import signal import pdb def trigger_debug(signum, frame): pdb.set_trace() # 绑定SIGUSR1信号到调试触发函数 signal.signal(signal.SIGUSR1, trigger_debug)kill -USR1 <你的程序进程ID>,程序会立刻进入pdb调试模式,此时能看到当前执行的代码位置,输入where命令即可查看完整调用栈,还能继续单步调试。
内容的提问来源于stack exchange,提问作者bzm3r
相关产品推荐
相关产品推荐

