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

如何在Windows 10下获取卡顿的Python v2程序的栈追踪?

Windows 10 + Python 2 运行中程序栈追踪方案

核心需求

我有一个Python程序,时不时会卡住,无法定位问题所在。
有没有办法向python.exe发送信号,让它显示当前运行的具体代码?
有没有一种实时获取栈追踪的方法?

程序通过.bat文件运行以便查看日志,但卡住时无任何输出;有权限访问源码但不熟悉项目细节,优先不修改源码,若必要也可修改,目标是收集信息提交有效Bug报告。


一、无需修改源码的方案

1. 使用Python自带pdb远程附加

步骤:

  • 打开任务管理器,找到卡住的python.exe进程,记录其PID(进程ID)
  • 打开命令提示符(CMD),确保使用与目标程序一致的Python 2环境,执行命令:
    python -m pdb -p <你的进程PID>
    
  • 成功附加后,输入where命令即可查看当前线程的完整栈追踪
  • 如果程序因死循环卡住,先输入interrupt中断当前执行,再输入where获取栈信息

注意:若程序的stdin/stdout被重定向(比如bat中隐藏了控制台),此方法可能无法正常交互,可尝试下面的工具方案。

2. 使用winpdb可视化调试器

winpdb是支持Windows和Python 2的跨平台调试工具,可轻松附加到运行中的进程:

  • 安装winpdb(Python 2版本):执行pip install winpdb(需确保Python 2的pip可用)
  • 运行winpdb启动可视化界面
  • 点击界面上的Attach按钮,在列表中选中目标python.exe进程
  • 连接成功后,在左侧面板即可查看当前所有线程的栈追踪,定位卡住的代码位置

二、需要修改源码的方案(仅当上述方法无效时使用)

定时自动输出栈追踪

在程序启动时添加一个后台线程,定时输出当前栈信息,方便程序卡住时回溯最后状态:

import traceback
import time
import threading

def periodic_stack_logger():
    while True:
        time.sleep(30)  # 每30秒输出一次栈信息,可根据需求调整间隔
        print("=== 定时栈追踪输出 ===")
        traceback.print_stack()
        print("====================")

# 在程序入口处启动后台线程(设置为守护线程,避免阻止程序正常退出)
threading.Thread(target=periodic_stack_logger, daemon=True).start()

将这段代码添加到程序的主入口文件中,重新运行程序后,日志中会定期出现栈信息,程序卡住时的最后一条栈记录就是问题所在。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:23:12