调试python虚拟机

调试python虚拟机,python,debugging,python-2.7,Python,Debugging,Python 2.7,是否有一个调试器可以在运行Python代码时调试Python虚拟机,类似于GDB与C/C++的工作方式?我在网上搜索过,遇到了pdb,但这是通过Python解释器执行的代码,而不是运行程序的Python解释器。Python的参考实现,CPython,是用C编写的。您可以使用GDB调试它,就像调试用C编写的任何其他程序一样 也就是说,Python确实有一些小助手可用于GDB。它有一些注释来描述每个命令的作用,但为了方便起见,我将在这里重复这些注释: pyo:转储PyObject* pyg:转储一

是否有一个调试器可以在运行Python代码时调试Python虚拟机,类似于
GDB
与C/C++的工作方式?我在网上搜索过,遇到了
pdb
,但这是通过Python解释器执行的代码,而不是运行程序的Python解释器。

Python的参考实现,CPython,是用C编写的。您可以使用GDB调试它,就像调试用C编写的任何其他程序一样

也就是说,Python确实有一些小助手可用于GDB。它有一些注释来描述每个命令的作用,但为了方便起见,我将在这里重复这些注释:

  • pyo
    转储
    PyObject*
  • pyg
    转储一个
    PyGC\u头*
  • pylocals
    打印当前Python堆栈帧的局部变量
  • lineno
    获取当前Python行号
  • pyframe
    打印源文件名、行和函数
  • pyframev
    pyframe
    +
    pylocals
  • printframe
    pyframe
    如果在
    PyEval_EvalFrameEx
    内;内置
    框架
    否则
  • pystack
    打印Python堆栈跟踪
  • pystackv
    使用局部变量打印Python堆栈跟踪
  • pu
    打印Unicode字符串

看起来Fedora项目也已组装起来,以帮助您进行调试,您可能也希望了解这些调试。

Python的参考实现CPython是用C编写的。您可以使用GDB对其进行调试,就像调试用C编写的任何其他程序一样

也就是说,Python确实有一些小助手可用于GDB。它有一些注释来描述每个命令的作用,但为了方便起见,我将在这里重复这些注释:

  • pyo
    转储
    PyObject*
  • pyg
    转储一个
    PyGC\u头*
  • pylocals
    打印当前Python堆栈帧的局部变量
  • lineno
    获取当前Python行号
  • pyframe
    打印源文件名、行和函数
  • pyframev
    pyframe
    +
    pylocals
  • printframe
    pyframe
    如果在
    PyEval_EvalFrameEx
    内;内置
    框架
    否则
  • pystack
    打印Python堆栈跟踪
  • pystackv
    使用局部变量打印Python堆栈跟踪
  • pu
    打印Unicode字符串

看起来Fedora项目也已经组装起来,以帮助您进行调试,您可能也希望看到它。

如果您希望在字节码级别调试Python,这正是
pdb
所做的


如果你想调试CPython引用解释器…正如icktoofay的回答所说,它和其他任何程序一样只是一个C程序,所以你可以用与其他C程序相同的方式调试它。(如果需要,您也可以获取源代码,使用额外的调试信息进行编译等。)

您几乎肯定想看看,它展示了如何设置一组GDB助手(当然是Python脚本),使您的生活更轻松。最重要的是:Python堆栈与C堆栈紧密绑定,但是试图手动映射东西是一个大麻烦。有了正确的帮助程序,您可以用Python术语而不是C术语来获取堆栈跟踪、帧转储等,或者与C术语并行地获取堆栈跟踪、帧转储等。另一个很大的好处是
py print
命令,它可以查找Python名称(与实时解释器的查找方式几乎相同),调用其
\uuuu repr\uuu
,并打印出结果(通过正确的错误处理和所有操作,您不会因为试图手动遍历
PyObject*
内容而导致
gdb
会话崩溃)

如果您正在寻找介于两者之间的某个级别,那么,在这两者之间就没有级别了。(从概念上讲,解释器有多个层,但都是C代码,而且在gdb看来都很相似。)


如果您想调试任何Python解释器,而不是特别是CPython,那么您可能想看看PyPy。PyPy是用一种类似Python的语言RPython编写的,有多种方法可以使用
pdb
来调试(R)Python解释器代码,尽管这并不是很容易(除非您使用的是平版翻译的PyPy,它的运行速度可能太慢了大约100倍,让人难以忍受)。PyPy也有GDB调试挂钩和脚本,就像CPython一样,但它们并不完整。

如果您希望在字节码级别调试Python,这正是
pdb
所做的


如果你想调试CPython引用解释器……正如icktoofay的回答所说,它和其他任何程序一样只是一个C程序,所以你可以用与其他C程序相同的方式调试它。(如果你愿意,你也可以获取源代码,用额外的调试信息编译它,等等。)

您几乎肯定想看看,它展示了如何设置一组GDB助手(当然是Python脚本)使您的生活更轻松。最重要的是:Python堆栈与C堆栈紧密绑定,但是尝试手动映射是一件非常麻烦的事情。有了正确的帮助程序,您可以毫不费力地以Python术语而不是C术语获取堆栈跟踪、帧转储等。另一大好处是
py print
命令,wh我可以查找Python名称(几乎在sa中)