SIGBUS
очень редко встречается в системах Linux / x86.
Один из случаев, когда это происходит, - это когда mmap
ed файл обрезается. От man mmap :
SIGBUS Attempted access to a portion of the buffer that does not
correspond to the file (for example, beyond the end of the
file, including the case where another process has truncated
the file).
Наше приложение извлекает библиотеки из ZIP перед загрузкой.
Дикая догадка: у вас есть состояние гонки, где вы можете выполнить это извлечение из двух отдельных потоков одновременно.
Первый поток извлекает libswt-gtk-4922r22.so
из архива ZIP и dlopen
s. dlopen
mmap
s файл, перемещает его и вызывает инициализатор библиотеки.
Во время работы инициализатора библиотеки второй поток решает, что библиотека должна быть извлечена (это ошибка), и обрезает файл .so
перед записью в него нового (идентичного) содержимого. Как только truncate завершится, первый поток (все еще работающий с инициализатором библиотеки) будет уничтожен с SIGBUS
.
Обычное исправление заключается в том, чтобы убедиться в том, что «проверка того, что файл существует, извлечение, если нет», выполняется в критическом разделе.