2016-06-29 89 views
-3

Im folgenden Screenshot sehen Sie die Zerlegung der CString-Funktion GetLength(), die zu einem Absturz führte. Dies ist aus dem Dumpfile, post mortem genommen. Der Absturz wird durch einen plötzlichen Wechsel von Register EAX zu 0 verursacht.Warum der Inhalt des EAX-Registers plötzlich geändert wird und zum Absturz führt

Wie kann es sein, dass von 6A6A4547 bis 6A6A4549 das Register EAX geändert werden könnte. In 6A6A4547 sollte es auf 0x6a8e7054 (0x38324964 {0x6a8e7054}) gesetzt worden sein. Sie können dies im Überwachungsfenster sehen. In 6A6A4549 ist EAX plötzlich "0".

Warum und wie? Kann ich herausfinden, was die Ursache war?

Side Informationen:

  • Call-Stack sieht normal keine Probleme in Variablen oder Fäden
  • seine mit VS2012-Compiler kompiliert
  • Zielplattform x86
  • seine auf einer virtuellen Maschine
  • Programm Läuft mit vielen Threads
  • GetLength wird Millionen Mal pro Stunde
  • aufgerufen

graph

+0

Und das geschieht völlig zufällig? Haben Sie es live gesehen, während Sie es in einem Debugger ausgeführt haben, oder basiert dieser Screenshot auf einem Core Dump? –

+1

Beachte den '[eax-0ch]', speziell den ** - 0ch ** Teil. Sehen Sie, was in '0x38324958' ist. –

+0

(int *) (0x38324958) -> 0x38324958 {0x00000000} Dies ist eigentlich der richtige Wert (es ist eine leere Zeichenfolge). Das Problem ist, dass eax 0x0000000 ist und anstelle von "0x38324958" der Wert "-12" als Adresse verwendet wird. – Kalman

Antwort

2

Es ist, als die meisten von Ihnen geschrieben - a race condition.

In einem oberen Teil der Software wurde ein Objekt nicht ausreichend gesperrt. Daher wurde EAX in der ersten Montagelinie 0. Danach hat ein anderer Thread den Speicher "korrigiert" und es sieht nur so aus, als ob das EAX-Register geändert wurde.

So wie die meisten Abstürze auch das ist hausgemacht.

Danke an euch alle!