Определение стека потока, который стоит на мьютексе
От: Рома Мик Россия http://romamik.com
Дата: 03.12.21 08:46
Оценка: -1
Изначально задача была определять ситуации, когда приложения "зависает" и сохранять стектрейс зависшего потока.
Для этого был заведен отдельный поток, который следит за основным потоком приложения: основной поток должен регулярно обновлять переменную, а наблюдающий поток раз в секунду проверяет, как давно она обновлялась, если прошло больше критического времени — надо сохранять стектрейс.
Получение стектрейса сделано с помощью "unwind.h" и работает хорошо.
Единственная сложность — код надо вызывать в том потоке, для которого нужен стектрейс. Для этого регистрируем обработчик сигнала SIGUSR2, и в нем сохраняем стектрейс. Т.е. наблюдающий поток отправляет сигнал, основной поток его получает, сохраняет стектрейс и сигналом же уведомляет наблюдающий поток, что он закончил. Это тоже работает хорошо.

Но если основной поток "повис" на мьютексе, то стектрейс состоит из всего двух записей:
000: 0x9c1ac /apex/com.android.runtime/lib/bionic/libc.so __epoll_pwait
001: 0x6df9c /apex/com.android.runtime/lib/bionic/libc.so epoll_wait


Дело происходит на андроиде. Но сильно подозреваю, что на любом линуксе, да и не только на нём, будет также.

Можно ли как-то узнать стек самого блокирующего вызова?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.