Как получить “ошибку шины”?

Я пытаюсь очень трудно получить ошибку шины.

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

Есть ли некоторая ситуация, которая, несомненно, произведет ошибку шины?

15
задан Lazer 15 January 2010 в 09:50
поделиться

9 ответов

Являются ли свойства X и Y (а не поля)? Если да, то это проблема. До тех пор, пока все поля в пределах x не будут точно назначены, нельзя вызывать какие-либо методы или свойства.

Например:

public struct Foo
{
    public int x;
    public int X { get { return x; } set { x = value; } }
}

class Program
{
    static void Main(string[] args)
    {
        Foo a;
        a.x = 10; // Valid

        Foo b;
        b.X = 10; // Invalid
    }
}

Является ли Vec2 вашим собственным типом? У вас есть доступ к соответствующим полям или только к свойствам?

Если это ваш тип, я бы настоятельно призвал вас попытаться придерживаться неизменяемых структур. Я знаю, что управляемый DirectX имеет несколько изменяемых структур для максимально приближенной к оптимальной производительности, но это ценой странных ситуаций, таких как эта - и гораздо хуже, если честно.

Я бы лично дал структуре конструктор, принимающий X и Y:

 Vec2 x = new Vec2(det * (a22 * b.X - a12 * b.Y),
                   det * (a11 * b.Y - a21 * b.X));
-121--2147997-

Он все еще не инициализирован. Перед использованием его необходимо инициализировать. Для этого можно использовать оператор default , если вы не хотите создавать статическое значение Vec.Empty и довольны значениями по умолчанию для членов структуры:

Vec2 x = default(Vec2);

Mitch Пшеница:

Это, однако, не означает:

public struct Vec2
{
    int x;
    int y;

   public float X { get { return x; } set { x = value; } }
   public float Y { get { return y; } set { y = value; } }

}
static void Main(string[] args)
{
    Vec2 x;

    x.X = 1;
    x.Y = 2; 
}

Компилятор запрещает вызывать propertis для типов до того, как все члены структуры будут инициализированы, даже если свойство может просто Решение, как предложил Джон Скит, состоит в том, чтобы иметь инициализирующий конструктор и предпочтительно не иметь установщиков.

-121--2147999-

Ошибки шины могут быть вызваны только на аппаратных платформах, которые:

  1. Требуют выровненного доступа, и
  2. Не компенсируют несогласованный доступ, выполняя два выровненных доступа и комбинируя результаты.

Вероятно, у вас нет доступа к такой системе.

12
ответ дан 1 December 2019 в 00:29
поделиться

Просто, запишите в память, которая не ваша:

int main()
{
    char *bus_error = 0;

    *bus_error = 'X';
}

ошибка мгновенной шины на моем PowerPC Mac [OS X 10.4, двойной 1 ГГц PPC7455], не обязательно на вашей аппаратной и / или операционной системе.

Там даже артикудия википедия о ошибках шины, включая программу, чтобы сделать один.

0
ответ дан 1 December 2019 в 00:29
поделиться

Как насчет это? непроверенный.

  #include<stdio.h>

    typedef struct
    {
    int a;
    int b;
    } busErr;

    int main()
    {
    busErr err;
    char * cPtr;
    int *iPtr;
    cPtr = (char *)&err;
    cPtr++;
    iPtr = (int *)cPtr;
    *iPtr = 10;
    } 
1
ответ дан 1 December 2019 в 00:29
поделиться

Как упомянул другие, это очень конкретно платформа. На системе ARM я работаю (у которой нет виртуальной памяти), есть большие части адресной площади, которые не имеют памяти или периферийных устройств. Если я прочитаю или напишу один из этих адресов, я получаю ошибку шины.

Вы также можете получить ошибку шины, если на самом деле есть аппаратная проблема в автобусе.

Если вы работаете на платформе с виртуальной памятью, вы можете не сможете намеренно генерировать ошибку шины с вашей программой, если это драйвер устройства или другое программное обеспечение для режима ядра. Недопустимый доступ к памяти, вероятно, будет в ловушке как нарушение доступа или аналогично менеджеру памяти (и даже не имеет возможности ударить на автобус).

3
ответ дан 1 December 2019 в 00:29
поделиться

Также имеем в виду, что некоторые операционные системы сообщают о «ошибке шины» для ошибок, кроме недоступных. Вы не упомянули в своем вопросе, что вы на самом деле пытались достичь. Может быть, попробуйте таким образом:

int *x = 0;
*x=1;

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

1
ответ дан 1 December 2019 в 00:29
поделиться

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

public DateTime EntryTime
{
  get  { return ((ITransaction)this).EntryTime; }
}

DateTime ITransaction.EntryTime
{
  get { throw new NotImplementedException(); }
}

Затем при создании Макета можно использовать синтаксис As < ITransaction > () , и макет будет вести себя так, как вы ожидаете.

-121--3196905-

Объект DisplayMetrics можно использовать для преобразования пикселов и масштабированных пикселов с атрибутом scaledDensity .

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 
-121--620864-

Попробуйте что-то примерно так:

#include <signal.h>
int main(void)
{
    raise(SIGBUS);
    return 0;
}

(Я знаю, вероятно, не тот ответ, который вы хотите, но это почти наверняка даст вам «ошибку шины»!)

7
ответ дан 1 December 2019 в 00:29
поделиться

Это должно привести к надежной работе SIGBUS на POSIX-совместимой системе.

#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
int main() {
    FILE *f = tmpfile();
    int *m = mmap(0, 4, PROT_WRITE, MAP_PRIVATE, fileno(f), 0);
    *m = 0;
    return 0;
}

Из Единой спецификации Unix, mmap:

Ссылки в диапазоне адресов, начиная с pa и продолжая для len байтами на целые страницы после окончания объекта, должны приводить к подаче сигнала SIGBUS.

17
ответ дан 1 December 2019 в 00:29
поделиться

Ошибки шины возникают при попытке получить доступ к памяти, не адресуемой компьютером. Например, память компьютера имеет диапазон адресов от 0x00 до 0xFF, но вы пытаетесь получить доступ к элементу памяти с адресом 0x0100 или выше.

В действительности, ваш компьютер будет иметь гораздо больший диапазон адресов, чем 0x00 - 0xFF.

Чтобы ответить на вашу первоначальную заметку:

Расскажите мне о ситуации, которая наверняка приведет к ошибке на шине.

В вашем коде, индексируйте в память способом, выходящим за рамки максимального предела памяти. Я не знаю ... использую какое-то гигантское шестнадцатеричное значение 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, индексируемое в числовое* ...

-1
ответ дан 1 December 2019 в 00:29
поделиться

на linux с процессором Intel попробуйте следующее:

int main(int argc, char **argv)
{
# if defined i386
    /* enable alignment check (AC) */
    asm("pushf; "
    "orl $(1<<18), (%esp); "
    "popf;");
# endif

    char d[] = "12345678";  /* yep! - causes SIGBUS even on Linux-i386 */
    return 0;
}

хитрость заключается в установке бита "alignment check" в одном из "специальных" регистров процессора.

см. также: здесь

3
ответ дан 1 December 2019 в 00:29
поделиться
Другие вопросы по тегам:

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