如何调试运行中的Python程序?以A1111 Stable Diffusion WebUI为例
程序挂起时获取Python堆栈跟踪的方法
是的,完全可以在Python程序挂起时手动中断并获取堆栈跟踪,以下是几种适配Anaconda环境的可行方案:
一、Ctrl+C触发内置堆栈打印
- 在Anaconda Prompt运行程序时,当程序挂起,直接按下
Ctrl+C,Python会抛出KeyboardInterrupt异常,默认会打印当前堆栈跟踪。 - 如果程序捕获了
KeyboardInterrupt并屏蔽了输出,可修改启动脚本,在异常处理中添加traceback模块调用:import traceback try: # 原程序启动逻辑 launch() except KeyboardInterrupt: traceback.print_exc() raise # 重新抛出中断,保证程序正常退出
二、使用pdb调试器
- 启动程序时附加pdb调试器,修改启动命令为:
python -m pdb launch.py - 程序挂起时,切换到Anaconda Prompt窗口按下
Ctrl+C进入pdb模式,输入where命令即可查看当前堆栈跟踪。 - 也可以在疑似挂起的代码段前插入断点:
运行到此处会暂停,输入import pdb; pdb.set_trace()continue让程序继续,待挂起时再按Ctrl+C进入调试查看堆栈。
三、启用faulthandler模块
- 这是Python内置模块,可在程序挂起时强制打印多线程堆栈,适合Ctrl+C无效的场景:
- 在启动脚本最开头添加:
import faulthandler faulthandler.enable() - 程序挂起时,按下
Ctrl+\(Windows系统可尝试Ctrl+Break),即可输出所有线程的堆栈信息。
四、使用py-spy工具(无侵入式)
- 先在激活的Anaconda环境中安装:
pip install py-spy - 程序挂起时,打开新的Anaconda Prompt窗口并激活同一环境,用
tasklist | findstr python(Windows)获取Python进程的PID,然后运行:py-spy dump --pid <你的进程PID> - 该工具无需中断程序,即可生成所有线程的堆栈跟踪,适合需要保留程序状态的场景。
注意事项
- 由于你使用了不兼容的库版本,堆栈跟踪可能会指向第三方库代码,需重点关注A1111 WebUI自身代码及硬件交互相关模块(如torch、CUDA类库)的调用栈。
- 建议多次复现挂起场景,收集多份堆栈信息,对比定位共性问题。
内容的提问来源于stack exchange,提问作者user81993
相关产品推荐
相关产品推荐

