Изначально задача была определять ситуации, когда приложения "зависает" и сохранять стектрейс зависшего потока.
Для этого был заведен отдельный поток, который следит за основным потоком приложения: основной поток должен регулярно обновлять переменную, а наблюдающий поток раз в секунду проверяет, как давно она обновлялась, если прошло больше критического времени — надо сохранять стектрейс.
Получение стектрейса сделано с помощью "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
Дело происходит на андроиде. Но сильно подозреваю, что на любом линуксе, да и не только на нём, будет также.
Можно ли как-то узнать стек самого блокирующего вызова?