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

手动单步调试正常,无断点运行卡顿,如何定位程序执行位置?

问题描述

我有一段存在问题的代码,开头和结尾都加了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:52:12