Sem_wait() вызывает исключение SIGBUSLinux

Ответить
Anonymous
 Sem_wait() вызывает исключение SIGBUS

Сообщение Anonymous »

У меня есть приложение командной строки C++ Linux, которое выполняет множество действий, а затем само закрывается. Я блокирую основной поток с помощью семафора, и когда фоновый поток завершает свою деятельность, он разблокирует семафор, освобождая основной поток, который возвращается из int main().

Код: Выделить всё

// Static definition of the semaphore object. This semaphore object is
// declared as a static array of 32 bytes in class A
uint8_t  A::semaphore[sizeof(sem_t)];
-----------------------------------------------------------------------

// In int main()
if(sem_init ((sem_t *) A::semaphore, 0, 0)) {
// failed to initialize semaphore
}

printf("semaphore = %p\n", A::semaphore);  // Prints 0x129ba01

// Create another thread(s) to execute work

// Main thread gets blocked here... until thread(s) complete their work.
sem_wait ((sem_t *) A::semaphore);

// Once main thread gets unblocked, return from int main() with return value
Я также подключил свой собственный обработчик исключений с помощью sigaction. Оказывается, когда основной поток достигает sem_wait, мой обработчик исключений вызывается со значением номера сигнала 7, что является исключением SIGBUS. Я также распечатал дополнительную информацию, используя объект siginfo_t, переданный обработчику исключений.

Код: Выделить всё

// Exception handler belonging to Class B
void B::handleException(int32_t signum, siginfo_t * info, void * context) noexcept
{
printf("signo = %d\n", info->si_signo); // Prints 7
printf("errno = %d\n", info->si_errno);
printf("code = %d\n", info->si_code);
printf("si_addr = %p\n", info->si_addr); // Prints 0x129ba01

....
}
Как показано выше, перехваченным исключением является SIGBUS и свойство si_addr siginfo, которое указывает на местоположение ошибки в памяти, печатает адрес семафора. Затем в документации по сигналу для SIGBUS указано следующее:

Например, недопустимый доступ к памяти, который приводит к доставке SIGSEGV на одной архитектуре ЦП, может вызвать доставку SIGBUS на другой архитектуре или наоборот.

Я думаю, что на самом деле я получаю исключение SIGSEGV... и есть какое-то нарушение доступа к памяти... но я не могу его найти.
Что мне здесь не хватает?
Примечание: SIGBUS выдается только в Linux Arm64. Мое приложение отлично работает на Linux x64.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -exception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»