Как отлаживать тупик с помощью Python?

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

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

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

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


person Fang-Pen Lin    schedule 09.02.2009    source источник
comment
Вызывается ли код Python из программы на C ++?   -  person David Z    schedule 09.02.2009
comment
Нет, программа python импортирует какое-то расширение C ++, которое я написал.   -  person Fang-Pen Lin    schedule 09.02.2009
comment
что интересно, на странице документации отладчика python нет никаких следов слова thread .   -  person Andre Holzner    schedule 24.11.2011
comment
Этот код печатает трассировки стека потоков, если они остаются в определенном месте: gist.github.com/niccokunzmann / 6038331   -  person User    schedule 29.01.2014


Ответы (1)


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

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

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

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

person Heikki Toivonen    schedule 09.02.2009
comment
Вы правы, я обнаружил, что источником тупика является DirectShow. - person Fang-Pen Lin; 09.02.2009