2013-08-02 2 views
0

Есть ли отладчик, который может отлаживать виртуальную машину Python при запуске кода Python, аналогично тому, как GDB работает с C/C++? Я искал онлайн и столкнулся с pdb, но этот шаг через выполненный код интерпретатор Python, а не интерпретатор Python при запуске программы.Отладка python VM

+1

Вы ищете что-то * на уровне байт-кода или ниже его? –

+1

И если вы ищете что-то под ним ... вы хотите отлаживать конкретную реализацию Python (предположительно CPython) или просто «любую реализацию, в зависимости от того, какая из них наиболее освещена/простейшая/и т. Д.»? – abarnert

ответ

2

Если вы хотите отлаживать Python на уровне байт-кода, это именно то, что делает pdb.

Если вы хотите отлаживать ссылочный интерпретатор CPython ... как говорит icktoofay, это просто программа на языке C, как и любая другая, поэтому вы можете отлаживать ее так же, как любая другая программа на C. (И вы можете получить источник, скомпилировать его с дополнительной информацией об отладке и т. Д., Если хотите.)

Вы почти наверняка хотите посмотреть на EasierPythonDebugging, в котором показано, как настроить кучу помощников GDB сценарии Python, конечно), чтобы сделать вашу жизнь проще. Самое главное: стек Python тесно связан с стеком C, но это большой беспорядок, чтобы попытаться сопоставить вещи вручную.С помощью правильных помощников вы можете получать трассировки стека, дампы кадров и т. Д. В терминах Python вместо или параллельно с условиями C без каких-либо усилий. Еще одним большим преимуществом является команда py-print, которая может искать имя Python (почти так же, как это делает живой интерпретатор), вызвать его __repr__ и распечатать результат (с правильной обработкой ошибок и всем, чтобы вы не попали сбой вашей gdb сеанса, пытающегося вручную передвигать PyObject*).

Если вы ищете какой-то уровень между ... ну, там is нет уровня между ними. (Концептуально, есть несколько слоев к переводчику, но это всего лишь C код, и все это выглядит так, чтобы GDB.)

Если вы хотите отлаживать любой интерпретатор Python, а не конкретно CPython, вы может захотеть взглянуть на PyPy. Он написан на языке Python, называемом RPython, и существует множество способов использовать pdb для отладки кода интерпретатора (R) Python, хотя это не так просто, как могло бы быть (если вы не используете плоский перевод PyPy, который будет вероятно, работает примерно на 100x слишком медленно, чтобы быть терпимым). Существуют также отладочные крючки и сценарии GDB для PyPy, как и для CPython, но они не такие полные.

7

Эталонная реализация Python, CPython, написан на C. Вы можете использовать GDB для отладки это, как вы бы отладить любую другую программу, написанную на C.

Это говорит, Python имеет несколько маленьких помощников для использовать в GDB buried under Misc/gdbinit. В нем есть комментарии, чтобы описать то, что делает каждая команда, но я буду повторять их здесь для удобства:

  • pyo: Собирает PyObject *.
  • pyg: Dump a PyGC_Head *.
  • pylocals: Распечатайте локальные переменные текущего фрейма стека Python.
  • lineno: Получить текущий номер строки Python.
  • pyframe: Распечатайте исходное имя файла, строку и функцию.
  • pyframev:pyframe + pylocals
  • printframe:pyframe если в течение PyEval_EvalFrameEx; встроенный frame В противном случае
  • pystack: Печать трассировки стека Python.
  • pystackv: Печать трассировки стека Python с локальными переменными.
  • pu: Печать строки в Юникоде.

Похоже, проект Fedora также собрал their own collection of commands, чтобы помочь с отладкой, на которую вы также можете захотеть взглянуть.

+0

Но если вы когда-либо пробовали это, это проще сказать, чем сделать, без помощников ... – abarnert

+0

@abarnert: Хорошая точка. Я думаю, у Python есть собственный набор связанных GDB-команд (к которым связана страница EasierPythonDebugging, к которой вы привязались); Я добавил его/их к моему ответу. – icktoofay

+0

Поскольку я думаю, что это именно то, чего хотел OP, вероятно, это был ответ, который должен был быть принят вместо моего, который пытался осветить это и различные другие вопросы, которые мог бы иметь в виду ... Но это не так, найти этот ответ, если люди будут искать. – abarnert