online - python пошаговая отладка




Есть ли способ подключить отладчик к многопоточному процессу Python? (6)

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

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


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

Удачи.

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


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

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

например

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

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


Используйте 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 или новее.

Скриншот http://winpdb.org/images/screenshot_winpdb_small.jpg


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


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

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


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

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





debugging