Debugen mit Visual Studio



  • Hallo Community,

    meine Anwendung arbeite mit insgesamt 12 Threads, einige sammeln Daten und speichern sie in einer Struktur, andere werten diese Daten aus, damit beim Lesen und Schreiben die Threads auf einen vollständigen Datensatz zugreifen können syncronisiere ich die Lese- und Schreibzugriffe mit EnterCriticalSection und LeaveCriticalSection. Jetzt kommt es vor dass die Anwendung crasht. Der Crash passiert erst einige Zeit (ca. 30 Sekunden) nachdem die threads gestartet wurden.
    Mit Hilfe des Debuggers habe ich versucht dem Problem auf die Spur zu kommen und erhalte mehrfach folgende Fehlermeldungen:

    Eine Ausnahme (erste Chance) bei 0x77e922b2 in Test_(debug).exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000304.

    und

    Eine Ausnahme (erste Chance) bei 0x47d92204 in Test_(debug).exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x47d92204.

    Im Threads Fenster sehe ich zwar welcher Thread den Fehler verusacht hat, aber die Disassamble Anzeiche Zeigt mir nur Adressen mit Fragezeichen. Wie bekomme ich heraus an welcher Stelle in meinem Programm der Fehler seinen Anfang nahm?


  • Mod

    Wen der Debugger stoppt schau in den Callstack.
    Evtl. ist dein Stack zerstört.



  • Also ich habe den Fehler in meiner Anwendung gefunden. Nicht auf direktem Weg, sondern ich habe die Abarbeitung meiner Datensätze geloggt, Anfang und Ende, und habe so herausgefunden, welcher Datensatz den Fehler verursacht. Danach bin ich mit dem Debugger für den fehlerverursachenden Datensatz Schritt für Schritt meine Funktionen durchgegangen und bin auf den Fehler gestossen. Obwohl ich nun die Fehlerstelle kenne, und den Fehler reproduzieren und auch erfolgreich beheben kann, weiss ich immer noch nicht wie ich zukünftig die Debuggerausgabe zu interpretieren habe.

    @martin
    Wie schaue ich in den Callstack? Wie weiss ich das er zerstörrt ist? Wie finde ich heraus was ihn zerstörrt hat?


  • Mod

    Der Callstack ist ein Debugger Fenster. Schau mal im Menüpunkt Debugger -> Windows

    Der Callstack zeigt Dir alle aufrufenden Funktionen, bis zur Crash Stelle. Das heißt selbst wenn die Crashstelle im Nirwana liegt, siehst Du evtl. wer sie aufgerufen hat.

    Gleichzeitig kann man evtl. vermuten, dass der Stack verändert wurde. MEvtl. wurde aber auch nur der Stackpointerverbogen.


Anmelden zum Antworten