Можно приаттачится с gdb к процессу и посмотреть backtrace. Если есть отладочная информация или map-файл для программы, то даже по названию функций может всё стать ясно. Я как-то раз словил непонятный зависон. Сделал так как описал выше. Смотрю идёт: malloc, malloc_check, а потом какой-то lock. Ну я в гуголь, вышел на багзиллу и узнал, что в более новых версиях glibc сей deadlock пофикшен.