Hallo
Windows 2000, Visual Studio (egal ob VS 6, oder VS 7). Ich schreibe eine Dll, die ich in eine (Fremd)Exe lade. Wenn ich _DEBUG definiere, läuft sie. Wenn nicht (NDEBUG), stürtzt die Fremdexe mitsamt der Dll ab. Die FremdExe hat keine DebugInfo, meine Dll hat schon eine. Die Stelle, wo ich abstürze ist in VS 6 oder in VS 7 verschieden. Der Callstack ist ständig völlig verschieden. Manchmal ist die Fremdexe drin, manchmal nur Microsoft Dlls.
Was passiert, ist, daß "jemand" Speicher freigibt, den meine Dll alloziert hat (new).
Drum ist auch klar, daß es in der _DEBUG Version nicht passiert, weil dort die delete und free Routinen auf Gültigkeit des freizugebenden Speichers checken.
Es könnte ein Fehler in der FremdExe sein, es könnte ein Fehler bei mir sein. Es könnte rein theoretisch auch ein Fehler in einer Microsoft Dll sein. Ich kann die Fremdprogramme nicht kompilieren.
Ich habe alle statischen Klassenvariablen entfernt. Die initialisiere ich jetzt in der Dll Main als Pointer. Ich komme in VS7 wunderbar durch die DllMain (Prozess_attach und alle Thread_attach), wunderbar durch die Initialisierungsroutine, die die fremdexe dann in meiner dll aufruft.
Ein Callstack sieht zum Beispiel so aus:
mfc42.dll!6c290631()
icad.exe!004c4867()
icad.exe!00514b5d()
icad.exe!00514945()
mfc42.dll!6c27da60()
mfc42.dll!6c29199b()
mfc42.dll!6c2932a2()
mfc42.dll!6c279fed()
mfc42.dll!6c290ffd()
mfc42.dll!6c2799d5()
mfc42.dll!6c2788ee()
mfc42.dll!6c278afb()
mfc42.dll!6c2a13a8()
USER32.DLL!77e2a3d0()
USER32.DLL!77e04605()
USER32.DLL!77e05b77()
Die Fehlermeldung ist
Unbehandelte Ausnahme bei 0x6c290631 in icad.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x00000084.
In VS6 gibt es diesen Stack
ICAD! 005059c2()
MFC42! 6c279e49()
MFC42! 6c2799d5()
MFC42! 6c2788ee()
MFC42! 6c278afb()
MFC42! 6c2a13a8()
USER32! 77e2a3d0()
USER32! 77e04605()
USER32! 77e05b77()
oder das nächste Mal diesen
ICAD! 004780be()
ICAD! 0055192d()
OBJPROPTB! 03a87236()
Die Fehlermeldung ist "Zugriffsverletzung"
Man sieht, mit Logik ist da nichts zu machen. Irgend"jemand" gibt Speicher frei, der ihm nicht gehört . Wäre wenigstens ne Möglichkeit.
Und nun suche ich ein Tool, mit dem ich Memory Corruption überprüfen kann, ohne daß ich die zu überprüfenden Exes, Dlls neu kompilieren muß.
Gefunden habe ich:
- Rational Purify (die Evaluaton Version läßt sich bei mir nicht lizensieren, eventuell frage ich doch noch bei IBM Support nach)
- GlowCode - das geht bei dem Absturz gleich mit runter
- Heap Agent - die möchten gerne, daß man _DEBUG definiert (dann ist ja alles in Ordnung) und außerdem muß man die Loadables neu kompilieren. Das ist nicht, was ich suche
- Memory Validator - Der findet alle Dlls, die beim Startup von icad. exe geladen werden, aber ich muß meine dll nachher per Kommando innerhalb des Programmes laden - und ich sehe nie Routinen von meiner Dll in Memory Validator. Außerdem scheint das keine Memory Corruption zu merken, sondern sich einfach auf Leaks zu konzentrieren.
Ich gebe ja zu, ich habe meine Lernzeit für diese Tools ein bißchen knapp bemeßen - aber ich sitze an diesem blöden Bug nun schon drei Tage und hoffe jetzt, daß mir vielleicht hier im Forum jemand weiterhelfen kann.
Ich danke Euch für Eure Zeit
Monika
Windows 2000, Visual Studio (egal ob VS 6, oder VS 7). Ich schreibe eine Dll, die ich in eine (Fremd)Exe lade. Wenn ich _DEBUG definiere, läuft sie. Wenn nicht (NDEBUG), stürtzt die Fremdexe mitsamt der Dll ab. Die FremdExe hat keine DebugInfo, meine Dll hat schon eine. Die Stelle, wo ich abstürze ist in VS 6 oder in VS 7 verschieden. Der Callstack ist ständig völlig verschieden. Manchmal ist die Fremdexe drin, manchmal nur Microsoft Dlls.
Was passiert, ist, daß "jemand" Speicher freigibt, den meine Dll alloziert hat (new).
Drum ist auch klar, daß es in der _DEBUG Version nicht passiert, weil dort die delete und free Routinen auf Gültigkeit des freizugebenden Speichers checken.
Es könnte ein Fehler in der FremdExe sein, es könnte ein Fehler bei mir sein. Es könnte rein theoretisch auch ein Fehler in einer Microsoft Dll sein. Ich kann die Fremdprogramme nicht kompilieren.
Ich habe alle statischen Klassenvariablen entfernt. Die initialisiere ich jetzt in der Dll Main als Pointer. Ich komme in VS7 wunderbar durch die DllMain (Prozess_attach und alle Thread_attach), wunderbar durch die Initialisierungsroutine, die die fremdexe dann in meiner dll aufruft.
Ein Callstack sieht zum Beispiel so aus:
mfc42.dll!6c290631()
icad.exe!004c4867()
icad.exe!00514b5d()
icad.exe!00514945()
mfc42.dll!6c27da60()
mfc42.dll!6c29199b()
mfc42.dll!6c2932a2()
mfc42.dll!6c279fed()
mfc42.dll!6c290ffd()
mfc42.dll!6c2799d5()
mfc42.dll!6c2788ee()
mfc42.dll!6c278afb()
mfc42.dll!6c2a13a8()
USER32.DLL!77e2a3d0()
USER32.DLL!77e04605()
USER32.DLL!77e05b77()
Die Fehlermeldung ist
Unbehandelte Ausnahme bei 0x6c290631 in icad.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x00000084.
In VS6 gibt es diesen Stack
ICAD! 005059c2()
MFC42! 6c279e49()
MFC42! 6c2799d5()
MFC42! 6c2788ee()
MFC42! 6c278afb()
MFC42! 6c2a13a8()
USER32! 77e2a3d0()
USER32! 77e04605()
USER32! 77e05b77()
oder das nächste Mal diesen
ICAD! 004780be()
ICAD! 0055192d()
OBJPROPTB! 03a87236()
Die Fehlermeldung ist "Zugriffsverletzung"
Man sieht, mit Logik ist da nichts zu machen. Irgend"jemand" gibt Speicher frei, der ihm nicht gehört . Wäre wenigstens ne Möglichkeit.
Und nun suche ich ein Tool, mit dem ich Memory Corruption überprüfen kann, ohne daß ich die zu überprüfenden Exes, Dlls neu kompilieren muß.
Gefunden habe ich:
- Rational Purify (die Evaluaton Version läßt sich bei mir nicht lizensieren, eventuell frage ich doch noch bei IBM Support nach)
- GlowCode - das geht bei dem Absturz gleich mit runter
- Heap Agent - die möchten gerne, daß man _DEBUG definiert (dann ist ja alles in Ordnung) und außerdem muß man die Loadables neu kompilieren. Das ist nicht, was ich suche
- Memory Validator - Der findet alle Dlls, die beim Startup von icad. exe geladen werden, aber ich muß meine dll nachher per Kommando innerhalb des Programmes laden - und ich sehe nie Routinen von meiner Dll in Memory Validator. Außerdem scheint das keine Memory Corruption zu merken, sondern sich einfach auf Leaks zu konzentrieren.
Ich gebe ja zu, ich habe meine Lernzeit für diese Tools ein bißchen knapp bemeßen - aber ich sitze an diesem blöden Bug nun schon drei Tage und hoffe jetzt, daß mir vielleicht hier im Forum jemand weiterhelfen kann.
Ich danke Euch für Eure Zeit
Monika