Как отладить тупик с питоном? - PullRequest
6 голосов
/ 09 февраля 2009

Я разрабатываю многопоточное приложение, которое блокируется.

Я использую Visual C ++ Express 2008 для отслеживания программы. Как только возникает тупик, я просто приостанавливаю программу и отслеживаю. Я обнаружил, что когда возникнет взаимоблокировка, из моего расширения C ++ появятся два потока с именем python.

Все они используют Queue в коде Python, поэтому я думаю, что тупик может быть вызван Queue. Но как только расширение входит в код Python, я не вижу ничего, кроме asm-кода и двоичного кода от отладчика VC ++.

Я хотел бы знать, есть ли способ вывести стек вызовов кода Python после того, как я приостановил программу? И как я могу узнать, какая блокировка в темах вызвала тупик?

1 Ответ

6 голосов
/ 09 февраля 2009

Если вы можете скомпилировать свой модуль расширения с помощью gcc (например, с помощью Cygwin ), вы можете использовать gdb и макрос pystack gdb для получения стеков Python в этой ситуации. Я не знаю, было бы возможно сделать что-то эквивалентное pystack в Visual C ++ Express, но вы все равно могли бы получить некоторые идеи от реализации макроса pystack.

Поскольку вы упоминаете, что в отладчике VC ++ вы видите только asm / binary, вам следует убедиться, что вы компилируете Python с символами отладки. Если VC ++ по-прежнему показывает asm, возможно, вам нужно сообщить VC ++, где находятся исходные файлы (извините, VC ++ не использовался годами, поэтому я не могу сказать, что именно вам может понадобиться, если бы это было так) .

Вы также можете получить некоторую важную информацию, добавив множество вызовов журналирования в свой код, как на стороне Python, так и на расширение C ++.

В любом случае, я почти уверен, что взаимоблокировки связаны не с очередью, а с вашим собственным кодом.

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