Есть некий софт, он вполне себе нормально работает, но иногда ему прилетает SIGABRT. Прилетает редко, примерно раз в месяц. Надо это отловить. Повесил обработчик на SIGSEGV и SIGABRT, в обработчике запускаю backtrace, даже собрал альтернативу утилите addr2line, так что при падении в лог пишется не просто текущий стек с адресами, а полностью вижу имя функции и строку, где произошло падение. Проверяю разными способами: посылка сигнала, повторный вызов free(), обращение по нулевому адресу, вызов abort(), бесконечная рекурсия. Везде приходит соответствующий сигнал, программа падает, в логе все выдается как надо.
Однако. Когда прилетает реальный аборт, эта схема почему-то не работает. Вижу в логе, что обработчик аборта вызывает backtrace, backtrace не проходит, прилетает сегфолт, обработчик сегфолт тоже пытается вызвать backtrace, и на этом все.
Добавил при запуске вызов sigaltstack, который выделяет отдельный стек для обработчика сигналов на случай порчи основного. Не помогло.
Почему на реальном SIGABRT backtrace падает, хотя на тестовых ошибках падение вполне нормально отлавливается? Как еще может прийти аборт, если я в софте не юзаю ни abort(), ни assert()? Еще вариант - вызов abort() из какой-то либы, но почему-то не получить backtrace..