LINUX.ORG.RU

История изменений

Исправление iliyap, (текущая версия) :

В кадре #12 в _int_malloc() случился сегфолт. Ты установил обработчик SIGSEGV, он был вызван в кадре #10. Обработчик сигнала сам вызвал malloc(), который в свою очередь попытался взять мьютекс хипа. Но мьютекс хипа уже взят в кадре #13. Мьютекс хипа видимо нерекурсивный, поэтому дедлок.

Не надо вызывать malloc() (и библиотечные функции вообще) из обработчика сигнала. Обработчик сигнала может быть вызван в произвольный момент, состояние библиотечных мьютексов может быть любым, библиотечные функции из-за этого становятся нереентерабельны. Вот что можно вызывать из обработчика сигнала: https://man7.org/linux/man-pages/man7/signal-safety.7.html

Первопричина сегфолта в malloc() неизвестна. Обычно такое бывает при повреждении хипа. Обычно при таких ошибках рекомендуют собрать своё приложение с address sanitizer (gcc -fsanitize=address -static-libasan). Или прогнать под valgrind memcheck. Но для многочасовых считалок valgrind не подходит, слишком медленный.

Исходная версия iliyap, :

В кадре #12 в _int_malloc() случился сегфолт. Ты установил обработчик SIGSEGV, он был вызван в кадре #14. Обработчик сигнала сам вызвал malloc(), который в свою очередь попытался взять мьютекс хипа. Но мьютекс хипа уже взят в кадре #13. Мьютекс хипа видимо нерекурсивный, поэтому дедлок.

Не надо вызывать malloc() (и библиотечные функции вообще) из обработчика сигнала. Обработчик сигнала может быть вызван в произвольный момент, состояние библиотечных мьютексов может быть любым, библиотечные функции из-за этого становятся нереентерабельны. Вот что можно вызывать из обработчика сигнала: https://man7.org/linux/man-pages/man7/signal-safety.7.html

Первопричина сегфолта в malloc() неизвестна. Обычно такое бывает при повреждении хипа. Обычно при таких ошибках рекомендуют собрать своё приложение с address sanitizer (gcc -fsanitize=address -static-libasan). Или прогнать под valgrind memcheck. Но для многочасовых считалок valgrind не подходит, слишком медленный.