我有一个Python应用程序,它不时卡住,我不知道在哪里。
是否有任何方法向Python解释器发出信号,以显示正在运行的确切代码?
某种飞行中的堆叠痕迹?
相关问题:
从Python代码中的方法打印当前调用堆栈 检查正在运行的进程正在做什么:打印未检测的Python程序的堆栈跟踪
我有一个Python应用程序,它不时卡住,我不知道在哪里。
是否有任何方法向Python解释器发出信号,以显示正在运行的确切代码?
某种飞行中的堆叠痕迹?
相关问题:
从Python代码中的方法打印当前调用堆栈 检查正在运行的进程正在做什么:打印未检测的Python程序的堆栈跟踪
当前回答
没有办法钩入正在运行的python进程并获得合理的结果。如果进程锁定,我所做的是连接strace并试图弄清楚到底发生了什么。
不幸的是,strace通常是“修复”竞争条件的观察器,因此输出在那里也是无用的。
其他回答
从Austin 3.3开始,您可以使用-w/——where选项来发出当前堆栈跟踪。参见https://stackoverflow.com/a/70905181/1838793
如果您想查看正在运行的Python应用程序,以类似top的方式查看“活动”调用堆栈,可以使用austin-tui (https://github.com/p403n1x87/austin-tui)。你可以从PyPI安装它。
pipx install austin-tui
请注意,它需要austin二进制文件才能工作(https://github.com/p403n1x87/austin),但随后您可以使用
austin-tui -p <pid>
Python -dv yourscript.py
这将使解释器以调试模式运行,并为您提供解释器正在做什么的跟踪。
如果你想交互调试代码,你应该像这样运行它:
Python -m PDB yourscript.py
它告诉python解释器使用模块“pdb”(python调试器)运行你的脚本,如果你这样运行它,解释器将以交互模式执行,很像GDB
你可以使用hypno包,像这样:
hypno <pid> "import traceback; traceback.print_stack()"
这将把堆栈跟踪打印到程序的标准输出中。
或者,如果你不想打印任何东西到stdout,或者你没有访问它的权限(例如守护进程),你可以使用madbg包,这是一个python调试器,允许你附加到一个正在运行的python程序并在当前终端中调试它。它类似于pyrasite和pyringe,但更新,不需要gdb,并使用IPython作为调试器(这意味着颜色和自动补全)。
要查看正在运行的程序的堆栈跟踪,你可以运行:
madbg attach <pid>
在调试器shell中,输入: 英国电信
免责声明——这两个包都是我写的
使用inspect模块。
进口检查 帮助(inspect.stack) 模块检查中的函数堆栈帮助:
堆栈(上下文= 1) 返回调用者帧上面堆栈的记录列表。
我发现它确实很有帮助。
Pydb值得一看,它是“松散地基于gdb命令集的Python调试器的扩展版本”。它包括信号管理器,可以在发送指定信号时启动调试器。
2006年的“代码之夏”项目研究了在名为mpdb的模块中向pydb添加远程调试功能。