2017-02-10 12 views
4

У меня многопоточное приложение, работающее в производственной среде, которое зависает в случайное время с FUTEX_WAIT_PRIVATE Состояние всех потоков и gdb показывает, что все потоки пытаются сделать вызов блокировки PyThread_acquire_lock. Это действительно массовое приложение с десятками тысяч строк кода, и я не могу догадаться, в какой строке это ошибка. Можно ли каким-то образом отладить эту проблему? Я могу исправлять потоки. Локальный вызов и запись в файл всех блокировок приобретаются/освобождаются в приложении, а затем читают этот файл в случае возникновения ошибки снова, но я думаю, что есть другие функции python, вызывающие PyThread_acquire_lock. Итак, как я могу отладить проблему? Может быть, возможно «подписаться» на этот вызов функции C из Python и записать все эти вызовы?Debug PyThread_acquire_lock deadlock

ответ

4

Вы в одном шаге от ответа: присоедините с gdb к запутанному процессу и используйте расширения Python gdb, чтобы исследовать линии, находящиеся в тупике.

Для gdb --version> = 7:

sudo apt install python2.7-dbg python3-dbg 
sudo gdb /usr/bin/python[3] <pid_of_deadlocked_process> 
(gdb) thread apply all py-list 
(gdb) thread 2 
(gdb) py-up 
(gdb) py-print <lock_object> 

Ссылки: https://docs.python.org/devguide/gdb.html, https://wiki.python.org/moin/DebuggingWithGdb

+0

Спасибо, это звучит хорошо, и я постараюсь это, когда поймать эту ошибку еще раз! – skavans