Ошибка шины по сравнению с отказом Сегментации

Вам также необходимо установить пакет redux. Выполните:

npm install --save redux

См. Руководство по быстрому запуску .

37
задан Suraj Jain 16 February 2017 в 14:34
поделиться

6 ответов

На большинстве архитектур, которые я использовал, различие состоит в том, что:

  • SEGV вызывается, когда вы обращаетесь к памяти, к которой вы не предназначены (например, вне вашего адресного пространства).
  • SIGBUS вызывается из-за проблем с выравниванием с ЦП (например, при попытке прочитать длинный из адреса, который не кратен 4).
46
ответ дан 27 November 2019 в 04:28
поделиться

Я предполагаю, что вы говорите о сигналах SIGSEGV и SIGBUS , определенных Posix.

SIGSEGV происходит, когда программа ссылается неверный адрес. SIGBUS является аппаратной ошибкой, определяемой реализацией. Действие по умолчанию для этих двух сигналов - завершение программы.

Программа может перехватывать эти сигналы и даже игнорировать их.

4
ответ дан 27 November 2019 в 04:28
поделиться

Например, ошибка шины может быть вызвана тем, что ваша программа пытается сделать то, что аппаратная шина не поддерживает. Например, в SPARC при попытке прочитать многобайтовое значение (например, 32-битное значение int) с нечетного адреса возникла ошибка шины.

Ошибки сегментации происходят, например, когда вы делаете доступ, который нарушает правила сегментации, то есть пытается читать или записывать память, которой вы не владеете.

6
ответ дан 27 November 2019 в 04:28
поделиться

SIGBUS также будет активирован, если вы mmap () файл и попытаться получить доступ к части сопоставленного буфера, которая выходит за пределы конца файла, а также в случае возникновения ошибок, таких как нехватка места. Если вы зарегистрируете обработчик сигнала с помощью sigaction () и зададите SA_SIGINFO , возможно, ваша программа будет проверять адрес памяти, вызвавший сбой, и обрабатывать только ошибки файлов с отображением памяти. ]

21
ответ дан 27 November 2019 в 04:28
поделиться

Интерпретируя ваш вопрос (возможно, неверно) как означающий «Я периодически получаю SIGSEGV или SIGBUS, почему это не согласованно?», Стоит отметить, что делать хитрые вещи с указателями нельзя гарантировано стандартами C или C ++, что приведет к сбою в сегменте; это просто «неопределенное поведение», которое, как я однажды выразился профессором, означает, что вместо этого оно может заставить крокодилов вылезти из полов и съесть вас.

Так что ваша ситуация может быть так, что у вас есть две ошибки, из которых первый происходят иногда вызывает SIGSEGV, а второй (если segfault не произошел и программа все еще работает) вызывает SIGBUS.

Я рекомендую вам выполнить отладчик и остерегаться крокодилов .

2
ответ дан 27 November 2019 в 04:28
поделиться

Это было бы дублированием Что такое ошибка шины? , если бы не t для

Может ли случиться так, что программа выдает ошибку сегмента и останавливается в первый раз, а во второй раз может выдать ошибку шины и выйти?

часть вопроса. Вы должны сами ответить на этот вопрос с помощью информации, найденной здесь.


Безумие: делать одно и то же снова и снова и ожидать разных результатов.
- Альберт Эйнштейн


Конечно, если принять вопрос буквально ...

#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main() {
    srand(time(NULL));
    if (rand() % 2)
        kill(getpid(), SIGBUS);
    else
        kill(getpid(), SIGSEGV);
    return 0;
}

Tada, программа, которая может завершиться с ошибкой сегментации при одном запуске и выйти с ошибкой шины при другом запуске.

1
ответ дан 27 November 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: