Immer noch Access Violation



  • Die Access Violation tritt in meinem Code auf, genau hier:

    Graphics graphics(pdc->m_hDC);
    


  • Habt ihr keine Ahnung wie ich das hinbekomme? Dieser Fehler nervt mich wirklich! 😡



  • Slayer schrieb:

    Die Access Violation tritt in meinem Code auf, genau hier:

    Graphics graphics(pdc->m_hDC);
    

    Das kann ja eigentlich nur passieren, wenn pdc ungültig ist. Welchen Wert hat denn pdc?



  • Ich glaub daran liegts nicht, da ich auch schon mit

    if(pdc)
    {
    ...
    }
    

    versucht habe den Fehler einzugrenzen.
    Der Debugger gibt mir übrigens folgenden Fehler aus:
    Nicht abgefangene Ausnahme in Test2.exe (GDI32.DLL): 0xC0000005: Access Violation.
    Und die Disassemblierung markiert folgendes: BFF24DD5 mov ax,word ptr gs:[ecx]
    Vielleicht hilft das den Fehler zu bestimmen?



  • Slayer schrieb:

    Ich glaub daran liegts nicht

    Wir sind hier nicht in der Kirche 😉

    Welchen Wert hat pdc konkret, wenn die Access Violation auftritt?

    Der Debugger gibt mir übrigens folgenden Fehler aus:
    Nicht abgefangene Ausnahme in Test2.exe (GDI32.DLL): 0xC0000005: Access Violation.
    Und die Disassemblierung markiert folgendes: BFF24DD5 mov ax,word ptr gs:[ecx]

    Wie sieht der Callstack aus?



  • Wie kann ich denn den Callstack auslesen? Und was soll der überhaupt sein?



  • Ach ja pdc hat den Wert: 0x00992960



  • Slayer schrieb:

    Ach ja pdc hat den Wert: 0x00992960

    Und welchen Wert hat pdc->m_hDC?

    Slayer schrieb:

    Wie kann ich denn den Callstack auslesen? Und was soll der überhaupt sein?

    Der Callstack ("Aufrufstapel") zeigt, welche Funktion welche andere Funktion aufgerufen hat. Dadurch lässt sich nachvollziehen, welchen Weg das Programm bis zu dem Fehler genommen hat. MSVC kann den Callstack im Debugger anzeigen.



  • pdc->m_hDC hat den Wert: 0x00000772



  • Und der Callstack sieht folgendermaßen aus:
    CTest2Doc::DrawFunc(CString {"+1x^2"}, unsigned long 0) line 112
    CEditF::OnDrawfunc() line 67
    _AfxDispatchCmdMsg(CCmdTarget * 0x00991730 {CEditF}, unsigned int 1002, int 0, void (void)* 0x0040118b CEditF::OnDrawfunc(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
    CCmdTarget::OnCmdMsg(unsigned int 1002, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
    CDialog::OnCmdMsg(unsigned int 1002, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes
    CWnd::OnCommand(unsigned int 1002, long 2368) line 2088
    CWnd::OnWndMsg(unsigned int 273, unsigned int 1002, long 2368, long * 0x0065f988) line 1597 + 28 bytes
    CWnd::WindowProc(unsigned int 273, unsigned int 1002, long 2368) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x00991730 {CEditF hWnd=???}, HWND__ * 0x00000934, unsigned int 273, unsigned int 1002, long 2368) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x00000934, unsigned int 273, unsigned int 1002, long 2368) line 368
    AfxWndProcBase(HWND__ * 0x00000934, unsigned int 273, unsigned int 1002, long 2368) line 220 + 21 bytes



  • Ist das der Callstack zum Zeitpunkt der Access Violation, oder hast du einen Breakpoint auf deine Zeile gesetzt?



  • Hier noch mal der Callstack wenn es die Access Violation gibt (bei Haltepunkt nach Graphics, was ja die Access Violation verursacht):
    CTest2Doc::DrawFunc(CString {"+1x^2"}, unsigned long 0) line 112
    CEditF::OnDrawfunc() line 67
    _AfxDispatchCmdMsg(CCmdTarget * 0x00991730 {CEditF}, unsigned int 1002, int 0, void (void)* 0x00401195 CEditF::OnDrawfunc(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
    CCmdTarget::OnCmdMsg(unsigned int 1002, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
    CDialog::OnCmdMsg(unsigned int 1002, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes
    CWnd::OnCommand(unsigned int 1002, long 1492) line 2088
    CWnd::OnWndMsg(unsigned int 273, unsigned int 1002, long 1492, long * 0x0065f988) line 1597 + 28 bytes
    CWnd::WindowProc(unsigned int 273, unsigned int 1002, long 1492) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x00991730 {CEditF hWnd=???}, HWND__ * 0x000005c8, unsigned int 273, unsigned int 1002, long 1492) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x000005c8, unsigned int 273, unsigned int 1002, long 1492) line 368
    AfxWndProcBase(HWND__ * 0x000005c8, unsigned int 273, unsigned int 1002, long 1492) line 220 + 21 bytes

    Der Callstack den ich vorher gepostet hab ist genau bei der Zeile in der es die Access Violation gibt.
    Kannst du mir helfen? 😕



  • Slayer schrieb:

    Der Callstack den ich vorher gepostet hab ist genau bei der Zeile in der es die Access Violation gibt.
    Kannst du mir helfen? 😕

    Es bringt nichts, wenn du hier Callstacks von irgendwelchen Breakpoints in deinem Code zeigst. Mach die Breakpoints weg, lass das Programm laufen, und wenn die Messagebox mit der Access Violation kommt, klick auf Wiederholen. Dann steht der Debugger wirklich dort, wo die Access Violation auftritt.



  • Sorry, das hier ist jetzt da wo die Access Violation auftritt 😉

    GDI32! bff24dd5()
    KERNEL32! bff958f8()
    GDIPLUS! 70d02833()
    Gdiplus::Graphics::Graphics(HDC__ * 0x00000776) line 61 + 13 bytes
    CTest2Doc::DrawFunc(CString {"+1x^2"}, unsigned long 0) line 124 + 15 bytes
    CEditF::OnDrawfunc() line 67
    CEditF::RedrawFunc() line 110
    CDrawOpt::OnZoomIn() line 63
    _AfxDispatchCmdMsg(CCmdTarget * 0x00991810 {CDrawOpt}, unsigned int 1004, int 0, void (void)* 0x00401177 CDrawOpt::OnZoomIn(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
    CCmdTarget::OnCmdMsg(unsigned int 1004, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
    CDialog::OnCmdMsg(unsigned int 1004, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes
    CWnd::OnCommand(unsigned int 1004, long 2004) line 2088
    CWnd::OnWndMsg(unsigned int 273, unsigned int 1004, long 2004, long * 0x0065f988) line 1597 + 28 bytes
    CWnd::WindowProc(unsigned int 273, unsigned int 1004, long 2004) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x00991810 {CDrawOpt hWnd=???}, HWND__ * 0x000007d0, unsigned int 273, unsigned int 1004, long 2004) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x000007d0, unsigned int 273, unsigned int 1004, long 2004) line 368
    AfxWndProcBase(HWND__ * 0x000007d0, unsigned int 273, unsigned int 1004, long 2004) line 220 + 21 bytes

    Kannst du mir jetzt helfen?



  • Kannst du mal GetDC zeigen?



  • Wie meinst du das? Den Rückgabewert oder was?



  • Vergiss es, hatte vergessen, dass das eine MFC-Funktion ist.
    Passiert das eigentlich direkt beim ersten Aufruf, oder geht das ein paarmal gut?



  • Manchmal geht es ein paar Mal gut und der Fehler kommt bei jedem 3. Aufruf, manchmal kommt der Fehler jedes Mal! Kannst du mir helfen?



  • Hast du keine Ahnung?



  • Hey, hast du keine Ahnung oder was?


Anmelden zum Antworten