Bei einem Kunden stuerzt ein Videoserver mehrmals taeglich ab. Der Code ist natuerlich fehlerfrei. Deshalb stellt sich die Frage: wieso? Die Antwort: in einem Register des Prozesors ist ein Bit zu viel gesetzt. Der Registerwert wird zum Speicherzugriff verwendet und: Boing, Zugriff auf nicht gemappten Speicher.
Die fragliche Stelle sieht in x86 Assembler so aus:
mov edx,dword ptr [ebp-0Ch] # Load bits into edx
sar edx,cl # Shift arithmetic right by value of cl
and edx,0FFh # Logical AND with 0x000000FF
Nach dem "and" ist der Wert von edx: 0x80000041 statt 0x00000041.
Frage: wie kann das sein? von einem "and" erwartet man, dass es alle Bits plattmacht, ausser der Maske.
Antwort: das kann nicht sein, aber es passiert auf Intels Hyperthreading Prozessoren unter Last etwa jedes milliardste Mal, wenn der Code ausgefuehrt wird. Laeuft der Prozess nur auf einem virtuellen Prozessor, dann passiet es nicht.
Das Problem wurde behoben, durch ein zweites "and edx,0FFh". Das klappt dann meistens. Aber das Warum bleibt. Fehler im Hyperthreading?
Nachtrag: Wir haben beschlossen, dass dieser eine Prozessor fehlerhaft ist und kein grundsaetzlicher Fehler vorliegt.
_happy_coding_
Keine Kommentare:
Kommentar veröffentlichen
Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.