2008-09-06 2 views
26

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

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

ответ

10

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

Вы можете вносить изменения с помощью резьбы .

например

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

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

0

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

EDIT: У меня нет опыта работы с GNU Debugger (GDB), который является кросс-платформой, однако я нашел это link, и он может начать вас по правильному пути. В нем объясняется, как добавлять символы отладки (удобные для чтения стеков стека) и как поручить gdb подключаться к запущенному процессу python.

3

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

3

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

6

Вы можете прикрепить отладчик к многопоточному процессу 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». Chris has some examples в своем блоге.

Удачи.

(Shoutout для Dan's blog для некоторой ключевой информации для меня, в частности, потоковая исправить!)

13

Использование Winpdb. Это независимая платформа графический отладчик GPL Python с поддержкой удаленной отладки по сети, несколько потоков, изменение пространства имен, встроенная отладка, зашифрованная связь и до 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 http://winpdb.org/images/screenshot_winpdb_small.jpg

0

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

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

0

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

Here описание как сделать.

+0

Сайт 404. Пожалуйста, включите сюда шаги. – luckydonald 2018-02-09 08:09:38

Смежные вопросы