2016-05-01 6 views
2

Ich arbeite an einem Variscite-Board mit einer yocto-Distribution und Python 2.7.3.So ermitteln Sie die Ursache für "BUS-Error"

Ich bekomme manchmal eine Busfehler Nachricht vom Python-Interpreter.
Mein Programm wird normalerweise mindestens einige Stunden oder Tage vor dem Fehler ausgeführt.
Aber wenn ich es einmal bekomme, bekomme ich es direkt, wenn ich versuche, mein Programm neu zu starten.
Ich muss neu starten, bevor das System wieder funktioniert.

Mein Programm verwendet nur eine serielle Schnittstelle, ein bisschen USB-Kommunikation und einige TCP-Sockets.

Ich kann zu einer anderen Hardware wechseln und die gleichen Probleme bekommen.

Ich benutzte auch die Python-Selbsttest mit
python -c "from test import testall"

Und ich bekomme Fehler für diese beiden Tests

test_getattr (test.test_builtin.BuiltinTest) ... ERROR test_nameprep (test.test_codecs .NameprepTest) ... ERROR

und der Selbsttest stoppt immer an

test_callback_register_double (ctypes.test.test_callbacks.SampleCallbacksTestCase) ... Segmentation Fehler

Aber wenn die Systeme läuft ein paar Stunden die Selbsttests früher stoppt bei

ctypes.macholib.dyld Busfehler

Ich habe den RAM mit Memtestes überprüft, es scheint in Ordnung zu sein.
Wie kann ich die Ursache für die Probleme finden?

+0

memtester Upgrade war eine gute Idee, aber Sie können Kernel-Nachrichten lesen wollen ('dmesg'). Letzte (und erste) Zeit, die ich vor ein paar Wochen einen "Bus-Fehler" bekam, war, während ich ein paar Git-Befehle ausführte, aber es war vielleicht etwas, da die Ursache meiner Festplatte eindeutig darin lag, dass Kernel-Spuren aufhörten sagen Sie, dass dies auch Ihr Blitz sein könnte. – jbm

+1

Normalerweise kommt ein Busfehler auf modernen Systemen, auf denen Linux ausgeführt wird, von dem Versuch, einen nicht ausgerichteten Speicherzugriff auszuführen. Was * normalerweise * passiert, wenn ein C-Programmierer denkt, dass er clever ist, indem er irgendeinen willkürlichen Zeiger auf einen Typ größer als "char" wirft, z. Faul über Serialisierung/Deserialisierung zu/von einem Datei- oder Socket-Lese-/Schreibpuffer. Ist Ihr gesamtes Programm tatsächlich in Python geschrieben oder wird Python nur als Testframework verwendet? Können Sie einfach einen Debugger an den Prozess anhängen und zurückverfolgen, wenn Sie den Busfehler treffen? –

Antwort

2

Busfehler werden im Allgemeinen von Anwendungen verursacht, die versuchen, auf Speicher zuzugreifen, den die Hardware nicht physisch ansprechen kann. In Ihrem Fall gibt es einen Segmentierungsfehler, der zu einer Dereferenzierung eines schlechten Zeigers oder ähnlichem führen kann, was zum Zugreifen auf eine Speicheradresse führt, die physikalisch nicht adressierbar ist. Ich würde von root anfangen, den Segmentierungsfehler zuerst zu verursachen, da der Busfehler das sekundäre Symptom ist.

0

Ein Jahr später fand ich die indirekte Ursache für die Probleme.

Ich schrieb ein crc16 Modul, welches verwendet:

from ctypes import c_ushort 
... 
value = c_ushort(crcValue >>8) ... 

Im Falle eines BUS-Fehler dies der problematischste Teil war.

Ich gehe nicht davon aus, dass die c_ushort() - Funktion selbst das Problem verursacht, es ist nur die Funktion, die zeigt, dass etwas kaputt ist.

Das Problem gegangen, nachdem das System Linux version 3.14.38-6QP+g8740b9f ([email protected]) (gcc version 4.9.2 (GCC))