First-chance exception at 0x7c809eec



  • 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-RAM

    ich 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-RAM

    Das 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 nicht

    Das 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


Anmelden zum Antworten