Sem_wait () запускает исключение SigbusC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Sem_wait () запускает исключение Sigbus

Сообщение Anonymous »

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

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

// 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
< /code>
Я также прикрепил свой собственный обработчик исключений, используя 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 < /code>: < /p>

Например, доступ к недопустимому памяти, который вызывает доставку Sigsegv на одну архитектуру ЦП может привести к доставке Sigbus на другую архитектуру, или наоборот. Sigsegv Исключение ... и есть некоторое нарушение доступа к памяти ... но я не могу его найти.
Чего мне здесь не хватает?
Примечание: Sigbus < /code> бросается только на Linux Arm64. Мое приложение отлично работает на Linux X64.

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

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

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

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

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

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