Что такое ошибка шины? - PullRequest
       79

Что такое ошибка шины?

238 голосов
/ 17 октября 2008

Что означает сообщение об ошибке шины, и чем оно отличается от ошибки сегмента?

Ответы [ 15 ]

1 голос
/ 19 ноября 2015

Причиной ошибки шины в Mac OS X было то, что я попытался выделить около 1 МБ в стеке. Это работало хорошо в одном потоке, но при использовании openMP это приводит к ошибке шины, потому что Mac OS X имеет очень ограниченный размер стека для неосновных потоков .

0 голосов
/ 30 октября 2018

Я согласен со всеми ответами выше. Вот мои 2 цента относительно ошибки шины:

Ошибка BUS не должна возникать из инструкций в коде программы. Это может произойти, когда вы запускаете двоичный файл и во время выполнения двоичный файл изменяется (перезаписывается сборкой или удаляется и т. Д.).

Проверка, так ли это: Простой способ проверить, является ли это причиной, - запустить запущенные экземпляры одного и того же двоичного файла и запустить сборку. Оба запущенных экземпляра вылетят с ошибкой SIGBUS вскоре после завершения сборки и заменит двоичный файл (тот, который в данный момент запущен обоими экземплярами)

Основная причина: Это происходит потому, что ОС меняет местами страницы памяти, а в некоторых случаях весь двоичный файл может находиться в памяти, и эти сбои происходят, когда ОС пытается извлечь следующую страницу из того же двоичного файла, но двоичный файл изменился с момента последнего чтения. 1012 *

0 голосов
/ 16 марта 2015

Я только что обнаружил, что на процессоре ARMv7 вы можете написать некоторый код, который выдает ошибку сегментации, когда не оптимизирован, но выдает ошибку шины при компиляции с -O2 (оптимизируйте больше). Я использую кросс-компилятор gcc arm gnueabihf из Ubuntu x64.

0 голосов
/ 06 февраля 2014

Чтобы добавить к тому, что blxtd ответил выше, ошибки шины также возникают, когда ваш процесс не может попытаться получить доступ к памяти определенной «переменной» .

for (j = 0; i < n; j++) {
                for (i =0; i < m; i++) {
                        a[n+1][j] += a[i][j];
                }
        }

Обратите внимание на ' непреднамеренное ' использование переменной 'i' в first 'для цикла '? Именно в этом случае возникает ошибка шины.

0 голосов
/ 26 июня 2012

Типичное переполнение буфера, которое приводит к ошибке шины,

{
    char buf[255];
    sprintf(buf,"%s:%s\n", ifname, message);
}

Здесь, если размер строки в двойных кавычках ("") больше размера буфера, это дает ошибку шины.

...