Есть ли способ присоединить отладчик к многопоточному процессу Python? - PullRequest
28 голосов
/ 06 сентября 2008

Я пытаюсь отладить тупик в многопоточном приложении Python после его блокировки. Есть ли способ подключить отладчик для проверки состояния процесса?

Edit: я пытаюсь это сделать в Linux, но было бы замечательно, если бы было кросс-платформенное решение. В конце концов, это Python:)

Ответы [ 8 ]

14 голосов
/ 16 февраля 2009

Использовать Winpdb . Это независимый от платформы графический отладчик Python GPL с поддержкой удаленной отладки по сети, несколькими потоками, модификацией пространства имен, встроенной отладкой, зашифрованной связью и в 20 раз быстрее, чем pdb.

Особенности:

  • Лицензия GPL. Winpdb - свободное программное обеспечение.
  • Совместим с CPython 2.3 до 2.6 и Python 3000
  • Совместимо с wxPython 2.6 - 2.8
  • Независимо от платформы и протестировано на Ubuntu Gutsy и Windows XP.
  • Пользовательские интерфейсы: rpdb2 основан на консоли, в то время как winpdb требует wxPython 2.6 или новее.

Screenshot
(источник: winpdb.org )

11 голосов
/ 11 сентября 2008

Да, GDB хорош для отладки более низкого уровня.

Вы можете изменить темы с помощью команды thread .

1007 * например *

(gdb) thr 2
[Switching to thread 2 (process 6159 thread 0x3f1b)]
(gdb) backtrace
....

Вы также можете проверить отладчики Python, такие как Winpdb или pydb Обе платформы независимы.

7 голосов
/ 15 февраля 2009

Вы можете присоединить отладчик к многопоточному процессу Python, но вам нужно сделать это на уровне C. Чтобы понять, что происходит, вам нужно, чтобы интерпретатор Python был скомпилирован с символами. Если у вас его нет, вам нужно скачать исходный код с python.org и собрать его самостоятельно:

./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy

Убедитесь, что ваша рабочая нагрузка работает на этой версии интерпретатора. Затем вы можете присоединиться к нему с помощью GDB в любое время. Ребята из Python включили пример «.gdbinit» в свой каталог Misc, в котором есть несколько полезных макросов. Однако он не работает для многопоточной отладки (!). Вам нужно заменить строки следующим образом

while $pc < Py_Main || $pc > Py_GetArgcArgv

со следующим:

while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)

В противном случае такие команды, как pystack, не будут заканчиваться на других потоках, кроме основного С этим материалом вы можете делать такие вещи, как

gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach

и посмотри, что происходит. Вид.

Вы можете разобрать, что это за объекты, с помощью макроса "pyo". У Криса есть несколько примеров в его блоге.

Удачи.

(Подпишитесь на блог Дэна , чтобы получить некоторую ключевую информацию для меня, в частности, исправление потоков!)

4 голосов
/ 10 ноября 2008

Мой опыт отладки многопоточных программ в PyDev (Eclipse в Windows XP) заключается в том, что потоки, созданные с использованием thread.start_new_thread, не могут быть перехвачены, но поток, созданный с помощью Threading. Thread может быть перехвачен. Надеюсь, что информация полезна.

4 голосов
/ 12 сентября 2008

Если вы имеете в виду pydb, то сделать это невозможно. Были некоторые усилия в этом направлении: смотри коммит svn , но он был заброшен. Предположительно winpdb поддерживает это .

0 голосов
/ 30 марта 2015

PyCharm IDE позволяет подключаться к работающему процессу Python начиная с версии 4.0.

Здесь описано, как это сделать.

0 голосов
/ 17 марта 2015

pdbinject позволяет вам вставить pdb в уже запущенный процесс python.

Исполняемый файл pdbinject работает только под python2, но также может отлично впрыскивать в python3.

0 голосов
/ 06 сентября 2008

На какой платформе вы пытаетесь это сделать? Большинство отладчиков позволяют подключаться к запущенному процессу, используя идентификатор процесса. Вы можете либо вывести идентификатор процесса через логирование, либо используя что-то вроде диспетчера задач. Как только это будет достигнуто, станет возможным проверять отдельные потоки и их стеки вызовов.

РЕДАКТИРОВАТЬ: У меня нет опыта работы с GNU Debugger (GDB), который является кроссплатформенным, однако я нашел эту ссылку , и она может направить вас на правильный путь. В нем объясняется, как добавить символы отладки (удобно для чтения трассировки стека) и как указать gdb подключаться к работающему процессу python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...