Frage

Was bedeutet der „Bus-Fehler“ Nachricht bedeuten, und wie unterscheidet es sich von einem segfault unterscheiden?

War es hilfreich?

Lösung

Bus-Fehler sind heutzutage selten auf x86 und auftreten, wenn Ihr Prozessor kann der Speicherzugriff angefordert nicht einmal versuchen, in der Regel:

  • mit einem Prozessorbefehl mit einer Adresse, die nicht ihre Ausrichtungsanforderungen nicht erfüllt.

Segmentation Fehler auftreten, wenn Zugriff auf den Speicher, die zu Ihrem Prozess nicht gehört, sie sind sehr häufig und sind in der Regel das Ergebnis:

  • mit einem Zeiger auf etwas, das ausgeplant wurde.
  • mit einem nicht initialisierten daher falschen Zeiger.
  • einen Null-Zeiger verwenden.
  • einen Pufferüberlauf.

PS: Um genauer zu sein, dies den Zeiger nicht manipuliert selbst, die Probleme verursachen wird, wird es den Zugriff auf den Speicher verweist er auf (Dereferenzierung)

.

Andere Tipps

Ein segfault wird Zugriff auf den Speicher, dass Sie nicht zugreifen darf. Es ist schreibgeschützt, Sie haben keine Berechtigung, etc ...

Ein Bus-Fehler versucht, auf Speicher zuzugreifen, die möglicherweise nicht dort sein können. Sie haben eine Adresse verwendet, die für diese Operation auf das System oder die falsche Art von Adresse bedeutungslos ist.

  

Ich glaube, der Kern wirft SIGBUS   wenn eine Anwendung Daten aufweist   Fehlausrichtung auf dem Datenbus. Ich denke   dass da die meisten [?] moderne Compiler   für die meisten Prozessoren Pad / align der   Daten für die Programmierer, die   Ausrichtungs Probleme der Vorzeit (mindestens)   gemildert, und man muss daher nicht sehen   SIGBUS zu oft in diesen Tagen (AFAIK).

Von: Hier

mmap minimal POSIX 7 Beispiel

"Bus-Fehler" passiert, wenn der Kernel SIGBUS ein Verfahren sendet.

Ein minimales Beispiel, die es produziert, weil ftruncate vergessen wurde:

#include <fcntl.h> /* O_ constants */
#include <unistd.h> /* ftruncate */
#include <sys/mman.h> /* mmap */

int main() {
    int fd;
    int *map;
    int size = sizeof(int);
    char *name = "/a";

    shm_unlink(name);
    fd = shm_open(name, O_RDWR | O_CREAT, (mode_t)0600);
    /* THIS is the cause of the problem. */
    /*ftruncate(fd, size);*/
    map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    /* This is what generates the SIGBUS. */
    *map = 0;
}

Ausführen mit:

gcc -std=c99 main.c -lrt
./a.out

Getestet in Ubuntu 14.04.

beschreibt SIGBUS wie:

  

Der Zugang zu einem nicht definierten Teil eines Speicherobjekts.

Das Mmap spec sagt, dass:

  

Referenzen innerhalb des Adressbereichs bei pa Starten und Len Bytes ganze Seiten nach dem Ende eines Objekts weiterhin wird in Lieferung eines SIGBUS Signals führen.

Und shm_open sagt, dass es Objekte der Größe erzeugt 0:

  

Das Shared-Memory-Objekt hat eine Größe von Null.

So bei *map = 0 wir über das Ende des zugeordneten Objekts berühren.

Unaligned Stapelspeicherzugriffe in ARMv8 aarch64

Dies wurde bei erwähnt: Was für einen Bus-Fehler ist für SPARC, aber hier werde ich ein reproduzierbares Beispiel liefern.

Alles, was Sie brauchen, ist ein freistehendes aarch64 Programm:

.global _start
_start:
asm_main_after_prologue:
    /* misalign the stack out of 16-bit boundary */
    add sp, sp, #-4
    /* access the stack */
    ldr w0, [sp]

    /* exit syscall in case SIGBUS does not happen */
    mov x0, 0
    mov x8, 93
    svc 0

Das Programm hebt dann SIGBUS auf Ubuntu 18.04 aarch64, Linux Kernel 4.15.0 in einem ThunderX2 Server-Maschine .

Leider kann ich es nicht auf QEMU v4.0.0 Benutzermodus wiedergeben, ich bin nicht sicher, warum.

Der Fehler erscheint durch die SCTLR_ELx.SA und SCTLR_EL1.SA0 Felder optional und kontrolliert zu sein, ich habe die damit verbundenen Dokumente zusammengefasst ein bisschen weiter hier .

Sie können auch SIGBUS erhalten, wenn eine Codepage kann aus irgendeinem Grunde nicht ausgelagert werden.

Ein klassisches Beispiel eines Bus-Fehler ist auf bestimmte architecures, wie der SPARC ( zumindest einige SPARCs, vielleicht hat dies) geändert worden ist, sind, wenn Sie einen falsch ausgerichtete Zugang tun. Zum Beispiel:

unsigned char data[6];
(unsigned int *) (data + 2) = 0xdeadf00d;

Dieser Code-Schnipsel versucht, den 32-Bit-Integer-Wert 0xdeadf00d an eine Adresse zu schreiben, die (wahrscheinlich) nicht richtig ausgerichtet ist, und einen Bus-Fehler auf Architekturen erzeugen, die „wählerisch“ in dieser Hinsicht sind. Die Intel x86 ist, nebenbei gesagt, nicht eine solche Architektur, wäre es, den Zugang ermöglichen (wenn auch es ausführen langsamer).

Es hängt von Ihrem Betriebssystem, CPU, Compiler und möglicherweise anderen Faktoren.

In der Regel bedeutet es der CPU-Bus einen Befehl nicht abschließen kann, oder einen Konflikt gelitten, aber dass eine ganze Reihe von Dingen bedeuten könnte, abhängig von der Umgebung und dem Code seines Laufe.

-Adam

Es bedeutet normalerweise einen nicht ausgerichteten Zugriff.

Ein Versuch, Speicher zuzugreifen, die nicht physisch vorhanden ist, würde auch einen Bus-Fehler geben, aber Sie werden nicht sehen, wenn Sie einen Prozessor mit einer MMU und einer OS verwenden, die nicht buggy ist, weil Sie nicht haben jede nicht vorhandene Speicher gemappt Ihre Prozess-Adressraum.

Ein spezielles Beispiel für einen Bus-Fehler begegnete ich nur während der Programmierung C auf OS X:

#include <string.h>
#include <stdio.h>

int main(void)
{
    char buffer[120];
    fgets(buffer, sizeof buffer, stdin);
    strcat("foo", buffer);
    return 0;
}

Falls Sie sich nicht an der docs strcat das zweite Argument hängt mit dem ersten durch das erste Argument zu ändern (die Argumente drehen und es funktioniert gut). Unter Linux gibt dies einen Segmentierungsfehler (wie erwartet), aber auf OS X gibt es einen Bus-Fehler. Warum? Ich weiß es wirklich nicht.

Ich war immer einen Bus-Fehler, wenn das Stammverzeichnis bei 100% liegt.

Mein Grund für Bus-Fehler unter Mac OS X war, dass ich über 1 MB auf dem Stapel zu verteilen versucht. Dies funktionierte gut in einem Thread, aber bei der Verwendung von OpenMP diese Laufwerke zu Bus-Fehler, weil Mac OS X sehr begrenzt ist Stapelgröße für nicht-Haupt-Threads .

, um hinzuzufügen, was oben beantwortet blxtd, Busfehler auch auftreten, wenn Ihr Prozess kann nicht die Erinnerung an eine bestimmte ‚Variable‘ zuzugreifen versuchen, .

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

Beachten Sie die versehentliche "Verwendung von Variable 'i' in der erster 'for-Schleife'? das ist, was in diesem Fall mit dem Bus Fehler verursacht.

Ich habe gerade auf die harte Tour, dass auf einem ARMv7 Prozessor können Sie einen Code schreiben, dass Sie einen Segmentation Fault, wenn nicht optimierten gibt, sondern gibt Ihnen einen Busfehler, wenn sie mit -O2 (optimieren mehr) zusammengestellt. Ich benutze gcc Arm gnueabihf Cross-Compiler von ubuntu x64.

Ich bin damit einverstanden oben mit allen Antworten. Hier sind meine 2 Cent über den BUS-Fehler:

Ein BUS-Fehler muss nicht von den Anweisungen entsteht innerhalb des Codes des Programms. Dies kann passieren, wenn Sie eine binäre ausgeführt werden und während der Ausführung wird die binäre geändert (überschrieben mit einem Build oder gelöscht etc.).

Überprüfen, ob dies der Fall ist: Ein einfacher Weg, um zu überprüfen, ob dies die Ursache, indem Sie Instanzen der gleichen binären starten und einen Build laufen. Sowohl die laufenden Instanzen würden mit einem SIGBUS Fehler Absturz kurz nach der Build abgeschlossen ist und ersetzt den binären (derjenige, der beide Instanzen derzeit ausgeführt werden)

Basiswert Begründung: Dies liegt daran, OS Speicherseiten tauschen und in einigen Fällen die gesamte binäre Eins im Speicher sein könnte und diese Abstürze auftreten würden, wenn das Betriebssystem die nächste Seite aus dem gleichen binären zu holen versucht, aber die binären hat mich verändert, seit sie zuletzt gelesen.

Ein typischer Pufferüberlauf, der in Busfehler ergibt, ist,

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

Hier, wenn Größe der Zeichenfolge in doppelten Anführungszeichen ( „“) ist mehr als buf Größe gibt es Bus-Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top