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