First-chance exception at 0x7c809eec
-
Hallo,
ich bekomme bei meinen Programm am start jedes mal eine "first-chance exception". Die exception wird geschmissen, wenn noch kein kode zum debuggen vorhanden ist. Wie kann ich das wegmachen?First-chance exception at 0x7c809eec in renajort.exe: 0xC0000005: Access violation reading location 0x00030000. First-chance exception at 0x7c809eec in renajort.exe: 0xC0000005: Access violation reading location 0x008c0000. First-chance exception at 0x7c809eec in renajort.exe: 0xC0000005: Access violation reading location 0x7c9b0000. First-chance exception at 0x7c809eec in renajort.exe: 0xC0000005: Access violation reading location 0x7f7f0000.
danke
-
Fillip schrieb:
Hallo,
ich bekomme bei meinen Programm am start jedes mal eine "first-chance exception". Die exception wird geschmissen, wenn noch kein kode zum debuggen vorhanden ist. Wie kann ich das wegmachen?First-chance exception at 0x7c809eec in renajort.exe: 0xC0000005: Access violation reading location 0x00030000. First-chance exception at 0x7c809eec in renajort.exe: 0xC0000005: Access violation reading location 0x008c0000. First-chance exception at 0x7c809eec in renajort.exe: 0xC0000005: Access violation reading location 0x7c9b0000. First-chance exception at 0x7c809eec in renajort.exe: 0xC0000005: Access violation reading location 0x7f7f0000.
danke
Für welches Programm? Mit welchem Compiler? Unter welchem OS?
Bitte umschreibe die Umstände etwas genauer
!
Moritz
-
Zu deinem Chef gehen und ihm sagen, dass du endlich eine gute erklärung dafür gefunden hast, dass dein Programm nicht geht...
Mal im Ernst, ein bisschen code wäre hilfreich
-
Compiler: M$ Visual Studio .Net 2003
Code:#include <windows.h> #include "Log.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { #ifdef _DEBUG Log::get() << "WinMain..."; #endif .... }
Die exceptions kommen aber gleich nach den programm start. wenn ich oben an der winmain breakpoints setze, kommen die exceptions trotzdem davor.
danke
-
Compiler: M**$** Visual Studio .Net 2003
und verschissen
wenn du microsoft so scheisse findest, wieso benutzt du dann deren compiler? irgendwie en bissl schwachsinnig, oder?
-
vielleicht hast du irgendwelche globalen Objekte, die die Exception auslösen könnten?
Wo tritt denn der Fehler genau auf?
MfG
DDR-RAM
-
otze schrieb:
Compiler: M**$** Visual Studio .Net 2003
und verschissen
wenn du microsoft so scheisse findest, wieso benutzt du dann deren compiler? irgendwie en bissl schwachsinnig, oder?
weil es der beste (bezahlbare) compiler + ide für windows ist?
vielleicht hast du irgendwelche globalen Objekte, die die Exception auslösen könnten?
Wo tritt denn der Fehler genau auf?
MfG
DDR-RAMich hab sonst nur das Singleton objekt "Log". Die instanz wird aber erst weiter unten erstellt. Wo genau der Fehler auftritt kann ich nicht sagen, der debugger kann nur die disassembly anzeigen:
C809ECA mov eax,dword ptr [ebp+0Ch] 7C809ECD test eax,eax 7C809ECF je 7C809F0B 7C809ED1 mov edx,dword ptr [ebp+8] 7C809ED4 test edx,edx 7C809ED6 je 7C80C858 7C809EDC lea edi,[edx+eax-1] 7C809EE0 cmp edi,edx 7C809EE2 jb 7C80C858 7C809EE8 and dword ptr [ebp-4],0 DA ---> 7C809EEC mov al,byte ptr [edx] 7C809EEE lea eax,[esi-1] 7C809EF1 not eax 7C809EF3 mov ecx,eax 7C809EF5 and ecx,edx 7C809EF7 mov dword ptr [ebp-1Ch],ecx 7C809EFA and eax,edi 7C809EFC mov dword ptr [ebp-20h],eax 7C809EFF cmp ecx,eax 7C809F01 jne 7C80C84C 7C809F07 or dword ptr [ebp-4],0FFFFFFFFh 7C809F0B xor eax,eax 7C809F0D call 7C80250B
-
Fillip schrieb:
otze schrieb:
Compiler: M**$** Visual Studio .Net 2003
und verschissen
wenn du microsoft so scheisse findest, wieso benutzt du dann deren compiler? irgendwie en bissl schwachsinnig, oder?
weil es der beste (bezahlbare) compiler + ide für windows ist?
comeau ist der beste compiler(50€), und gute ides gibts auch zu hauf(kostenlos),mingw und devcpp nur so als beispiel.
-
Wenns zu dem Zeitpunkt passiert, dann wirds im Zweifel daran liegen, dass irgendwelche statischen Objekte auf andere statische Objekte zugreifen. Die Reihenfolge der Initialisierung statischer Objekte ist nicht festgelegt, und so kann es sein, dass eines bei seiner Initialisierung auf ein anderes zugreift, das zu dem Zeitpunkt noch nicht initialisiert ist.
jedenfalls ist das meine erste Vermutung.
-
0xdeadbeef schrieb:
Wenns zu dem Zeitpunkt passiert, dann wirds im Zweifel daran liegen, dass irgendwelche statischen Objekte auf andere statische Objekte zugreifen. Die Reihenfolge der Initialisierung statischer Objekte ist nicht festgelegt, und so kann es sein, dass eines bei seiner Initialisierung auf ein anderes zugreift, das zu dem Zeitpunkt noch nicht initialisiert ist.
jedenfalls ist das meine erste Vermutung.
klingt gut, kann aber nicht sein:
ich habe nur ein einziges statisches objekt und das ist die instanz des singletons. Auch andere globale objekte gibt es nicht
-
was hasten du jetzt fürn prob mit microsoft?
schreib an billy ne email *lol*zurück zum Thema:
das Singleton objekt "Log", was auch immer das sein soll, ist das Objekt global? dann interessiert es nicht, wo du es deklarierst, es wird auf jeden fall vor WinMain initialisiert.Welche funktion ruft die fehlerverursachende auf? (Stichwort callstack)
Also bitte nur echte Funktionsnamen, wie WinMainCRTStartup stell ich mir da gerade vor z.B. oder $E21 oder _initterm sowas in der art.
(Die letzten beiden wären ein ganz starkes Anzeichen für meine Vermutung)
Achso, du kompilierst noch im Debug mode oder?
MfG
DDR-RAM
-
DDR-RAM schrieb:
was hasten du jetzt fürn prob mit microsoft?
schreib an billy ne email *lol*zurück zum Thema:
das Singleton objekt "Log", was auch immer das sein soll, ist das Objekt global? dann interessiert es nicht, wo du es deklarierst, es wird auf jeden fall vor WinMain initialisiert.Welche funktion ruft die fehlerverursachende auf? (Stichwort callstack)
Also bitte nur echte Funktionsnamen, wie WinMainCRTStartup stell ich mir da gerade vor z.B. oder $E21 oder _initterm sowas in der art.
(Die letzten beiden wären ein ganz starkes Anzeichen für meine Vermutung)
Achso, du kompilierst noch im Debug mode oder?
MfG
DDR-RAMDas singleton "Log" ist nicht global, die instanz wird erst beim 1. aufruf von Log::get() erzeugt und dieser ist nach winMain
callstack:
> kernel32.dll!7c809eec() kernel32.dll!7c812b05() kernel32.dll!7c8399f3() TTcore.dll!2001f27d() kernel32.dll!7c80b86e() TTcore.dll!2001c047() ntdll.dll!7c90f0aa() kernel32.dll!7c8399f3() kernel32.dll!7c80e82b() kernel32.dll!7c80e65b() TTcore.dll!2001aa83() TTcore.dll!2001acb9() TTcore.dll!200169e7() ntdll.dll!7c926abe() ntdll.dll!7c96e0f0() ntdll.dll!7c94a5d0() ntdll.dll!7c926abe() ntdll.dll!7c91b298() ntdll.dll!7c91b686() ntdll.dll!7c9106eb() ntdll.dll!7c96e0d4() ntdll.dll!7c926abe() ntdll.dll!7c926abe() ntdll.dll!7c9268ad() kernel32.dll!7c812920() ntdll.dll!7c926abe() ntdll.dll!7c9268ad() ntdll.dll!7c91056d() ntdll.dll!7c914652() ntdll.dll!7c910970() ntdll.dll!7c90fb6c() ntdll.dll!7c90fb71() ntdll.dll!7c91056d() kernel32.dll!7c809392() ntdll.dll!7c95db5c() ntdll.dll!7c96cd11() ntdll.dll!7c96e6a9() ntdll.dll!7c96e723() ntdll.dll!7c96e707() TTcore.dll!2000178f() ntdll.dll!7c96e707() ntdll.dll!7c94976b() TTcore.dll!20034595() TTcore.dll!20024f14() TTcore.dll!20024f1d() TTcore.dll!20034595() ntdll.dll!7c9106eb() TTcore.dll!2002411a() TTcore.dll!20022a98() TTcore.dll!2002033b() TTcore.dll!20020335() TTcore.dll!20034595() TTcore.dll!20020335() TTcore.dll!20020345() TTcore.dll!20034595() TTcore.dll!2003449b() TTcore.dll!20034595() TTcore.dll!20022b10() TTcore.dll!20022894() ntdll.dll!7c9119fa() ntdll.dll!7c911ad6() advapi32.dll!77dd9bb8() TTcore.dll!200229b2() ntdll.dll!7c9011a7() ntdll.dll!7c91cbab() ntdll.dll!7c91c94d() ntdll.dll!7c91d6d2() ntdll.dll!7c91d9cb() ntdll.dll!7c90e027() ntdll.dll!7c9232c8() ntdll.dll!7c91056d() kernel32.dll!7c8172f8() ntdll.dll!7c92173e()
-
geht ja doch ziehmlich tief
nochweiter zurück kommst du nicht?also kompilierst du nun im debug mode?
und kannst du in der WinMainCRTStartup nen breakpoint setzen?und was ist die TTcore.dll?
kann es sein, das die fehlerhaft ist, wenn man das mal so vorsichtig fragen darf?MfG
DDR-RAM
-
Fillip schrieb:
klingt gut, kann aber nicht sein:
ich habe nur ein einziges statisches objekt und das ist die instanz des singletons. Auch andere globale objekte gibt es nichtDas kann sogar sehr gut sein, nämlich wenn man das singleton falsch anfasst. Ich hab den Fehler bei meiner Factory-template zu Anfang auch gemacht, das sah dann in etwa so aus:
class singleton { public: static int do_something() { return instance.x = 3; } private: singleton() : x(0) { } int x; static singleton instance; }; // ... int foo = singleton::do_something();
Richtig wärs so:
class singleton { public: static int do_something() { return instance().x = 3; } private: singleton &instance() { static singleton me; return me; } int x; };
Der Trick ist, dass die Instanz in dem Fall innerhalb der Methode steckt und initialisiert wird, wenn die Funktion zum ersten Mal aufgerufen wird. Das heißt, sie ist auf jeden Fall initialisiert, wenn sie benutzt wird.
-
ja, ich compile im debug modus und weiter zurück komme ich nicht mehr.
Wenn ich einen breakpoint in der WinMainCRTStartup setze, bringt das nichts. die exception kommt vorher
ich verwende ebenfalls den "trick" mit der instanz nur innerhalb der get methode