Probleme mit uneklärlichen Abstürzen



  • Hallo!

    Ich habe ein etwas größeres Problem:
    In meiner Software (MFC, VS2005) treten seit einer Umstellung sehr merkwürdige Abstürze auf. Was das Merkwürdigste ist: beinahe alle passieren im Zusammenhang mit einer Klasse, bei der ich mir aber nicht erklären kann, woran es liegen könnte.

    Folgende Symptome treten auf:
    - Zuweisen eines Objektes dieser Klasse auf ein anderes stürzt ab mit einem "Lock"
    - Visual Leak Detector liefert keine Speicherlöcher, aber natürlich nur wenn die Software nicht abstürzt.
    - Beim Zugriff auf einen Funktion in einer DLL stürzt das Ganze ab ("Zugriffsverletzung an Adresse 0x0", unbehandelte Ausnahme)
    - In der alten Version gehts, obwohl an den betroffenen Stellen nix geändert wurde.
    - Wenn das Ganze als "Release" kompiliert wird treten die Fehler an anderen Stellen auf als im "Debug"

    Ich weiß mir langsam nicht mehr zu helfen.
    Hat irgendjemand nen Tip für mich, wie ich das Problem finden könnte?

    Danke!



  • jholzer schrieb:

    - Wenn das Ganze als "Release" kompiliert wird treten die Fehler an anderen Stellen auf als im "Debug"

    Bei sowas suche ich zuerst einmal nach nicht initialisierten Variablen.


  • Mod

    Debuggen! Was sagt der Callstack an der Stelle, wenn es knallt.

    ASSERT(AfxCheckMemory()); an verschiedenen Stellen einbauen und sehen was passiert (geht nur im Debug-Mode).



  • Danke erst mal für die Hinweise!

    Leider haben die mich auch nicht wirklich weitergebracht.

    Dafür habe ich ein neues Symptom gefunden:
    Wenn ich aus meiner Klasse eine Eigenschaft vom Typ int auf eine lokale Variable (auch int) zuweise bekomme ich den 2^16-fachen Wert.
    Im betroffenen Fall wäre der wert 122 (1111010) im Feld gespeichert, meine lokale Variabel hat dann aber 7995392 (1111010 00000000 00000000)

    Kanne sein, dass ich mir da irgenwo Probleme mit den Datentypen eingehandelt habe?
    Weiß jemand ne vorgehensweise, wie ich die am besten finde?


  • Mod

    Das Structure Alignment stimmt nicht.
    Hast Du pragma pack irgendwo verwendet.
    Die Strutkturen und die Ausrichtung der einzelnen Felder passen evtl. in den unterschiedichen Objektmodulen nicht zusammen.



  • Ich hab grad mal meinen Code nach "pragma" durchsucht.
    Die einzigen, die ich in meinem eigenen Code verwende sind (jeweils mehrfach):
    once
    code_page
    comment

    In einer DLL, die ich angezogen haben wird allerdings ein

    #pragma pack(1)

    verwendet.

    Wie wirkt sich das auf meinen Code aus?
    Muss ich da dann evtl auch irgendwas setzen oder Compiler-Einstellungen machen, damit´s funzt?


  • Mod

    Das pargama pack wirkt sich auf die Füllbytes zwischen Member von Strukturen und Klassen aus. Wenn also das pragma pack hier vor einer Struktur verwendet wird und in einem anderen Code Segment nicht, dann führt das zu Problemen weil die Memeber der Strukturen an unterschieldichen Offsets gelesen/geschrieben werden.

    Deshlab gehört ein pragma pack immer nur in Header und gehört nachdem man es nicht mehr benötigt sofort wieder zurückgesetzt.



  • Wäre es von dem her gesehen sinnvoll wenn ich das in meinen eigenen Headern auch setze? An dem fremden Code der DLL kann ich nix ändern...


  • Mod

    Man muss es nicht setzen, wenn es nirgends verwendet wird. Wenn die Struktur aus der DLL bei der pragma pack verwendet ist, nicht die ist die Dir Sorgen bereitet, dann mag es etwas ganz anders sein.



  • jholzer schrieb:

    Hallo!

    Ich habe ein etwas größeres Problem:
    In meiner Software (MFC, VS2005) treten seit einer Umstellung

    Mal ins Blaue hinein:

    Mach mal jeweils einen kompletten Rebuild der Projektes; ggf einfach die temporären Verzeichnisse zusätzlich löschen.

    Vielleicht hilft's ja.

    Grüsse
    *this

    P.S.: Ein int von 3 Bytes ist schon sehr verdächtig; da sind irgendwelche Adressen anscheinend komlpett verrutscht.



  • Die Idee hatte ich auch schon. Habe alles in obj und bin komplett gelöscht, ohne Erfolg. Auch ein Export der Sourcen aus der Versionierung in ein frisches Verzeichnis hat nix gebracht...


Anmelden zum Antworten