Was bedeutet "BUS_ADRALN - Invalid address alignment" - Fehler bedeutet?
Sind wir auf HPUX und mein code ist in C++.
Wir sind immer
BUS_ADRALN - Invalid address alignment
in unserem ausführbare Datei auf einen Aufruf der Funktion. Was bedeutet diese Fehlermeldung bedeutet?
Gleiche Funktion viele Male dann plötzlich seine Angabe der core-dump.
in GDB, wenn ich versuche, drucken Sie die Objekt-Werte es sagt, nicht im Kontext.
Keine Ahnung, wo zu prüfen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie mit einem Daten-alignment-problem. Dies ist wahrscheinlich verursacht, indem Sie versuchen zu Lesen oder zu schreiben, durch eine schlechte Zeiger in irgendeiner Form.
Einer Daten-alignment problem ist, wenn die Adresse einem Zeiger gerichtet ist, ist nicht 'ausgerichtet' richtig. Zum Beispiel, einige Architekturen (die alten Cray-2 zum Beispiel) verlangen, dass jeder Versuch, Sie zu Lesen, alles andere als ein einzelnes Zeichen aus dem Speicher nur auftreten durch einen Zeiger in der die letzten 3 bits des Zeigers mit dem Wert 0 sind. Wenn einer die letzten 3 bits 1 sind, wird die hardware erzeugen Sie ein alignment-Fehler, welche die Art von problem, das Sie sehen.
Meisten Architekturen sind nicht annähernd so streng und Häufig auch die erforderliche Ausrichtung hängt von der genauen Art, auf die zugegriffen wird. Zum Beispiel, eine 32-bit-integer erfordern möglicherweise nur die letzten 2 bits der Zeiger auf 0 stehen, aber ein 64-bit-float möglicherweise benötigen Sie die letzten 3 bits zu 0.
Ausrichtung Probleme werden in der Regel durch die gleichen Arten von Problemen dazu führen würde, dass ein segmentation Fault oder segmentation fault. In der Regel ein Zeiger, der nicht initialisiert wurde. Aber es könnte verursacht werden durch einen Defekten Speicher-Zuweisung, die nicht zurückkehren Zeiger mit der richtigen Ausrichtung, oder durch das Ergebnis von Zeiger-Arithmetik auf den Zeiger, wenn es nicht vom richtigen Typ ist.
Die Umsetzung von
malloc
- und/oderoperator new
sind fast sicher korrigieren oder Ihr Programm würde Abstürzen Weg, bevor Sie es derzeit tut. So schlimm finde ich den memory allocator ist die am wenigsten wahrscheinlich Baum zu gehen, zu bellen auf. Ich würde zunächst prüfen, für einen nicht initialisierten Zeiger und dann schlecht Zeiger-Arithmetik.Als seitliche Anmerkung die x86-und die x86_64-Architekturen haben keine alignment-Anforderungen. Aber, weil, wie cache-Zeilen zu arbeiten, und aus verschiedenen anderen Gründen, ist es oft eine gute Idee für performance richten Ihre Daten auf eine Grenze, die ist so groß wie der Datentyp gespeichert werden (D. H. ein 4-byte-Grenze für ein 32-bit-int).
Meisten Prozessoren (nicht x86 und Freunde.. die blacksheep der Familie lol) erfordern Zugriffe auf bestimmte Elemente ausgerichtet werden, auf ein Vielfaches von bytes. I. e. wenn Sie Lesen eine ganze Zahl aus der Adresse 0x04, dass ist okay, aber wenn Sie versuchen, das gleiche zu tun aus 0x03 Sie verursachen ein interrupt geworfen werden.
Ist dies, weil es einfacher zu implementieren, die load/store-hardware, wenn es immer auf ein Vielfaches der Größe der Daten, mit denen Sie arbeiten.
Da HP-UX läuft nur auf RISC-Prozessoren, die in der Regel haben solche Einschränkungen, Sie sollten finden Sie hier -> http://en.wikipedia.org/wiki/Data_structure_alignment#RISC.
Tatsächlich um HP-UX hat seinen eigenen großen forum auf ITRC und einige HP-Mitarbeiter sind sehr hilfsbereit. Ich habe gerade einen Blick auf das gleiche Thema, das Sie Fragen, und hier sind einige Ergebnisse. Zum Beispiel das ähnliche problem verursacht wurde tatsächlich von einer schlechten input-parameter. Ich raten Ihnen dringend, zuerst zu Lesen, Antworten auf ähnliche Frage und, wenn notwendig, zu posten Sie Ihre Frage dort.
Übrigens ist es wahrscheinlich, dass Sie gebeten werden, die post-Ergebnisse dieser
gdb
Befehle:Meisten dieser Probleme werden verursacht, indem man mehrere upstream-Abhängigkeiten verknüpfen, um verschiedene Versionen der gleichen Bibliothek.
Zum Beispiel, sowohl die gnustl und stlport liefern unterschiedliche Implementierungen der C++ standard-Bibliothek. Wenn Sie kompilieren und linken gegen gnustl, während eine Ihrer Abhängigkeiten wurde kompiliert und gelinkt gegen die stlport, dann werden Sie haben jeweils eine unterschiedliche Implementierung von standard-Funktionen und-Klassen. Wenn Ihr Programm gestartet wird, wird der dynamische linker wird versuchen, Sie zu beheben, werden alle exportierten Symbole, und entdecken Sie bekannte Symbole an falschen offsets, was in der BUS_ADRALN signal.