如何在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
相关产品推荐
相关产品推荐

