none
erneutes Problem mit Debug Assertion Failed (wincore.cpp, Line 2067) RRS feed

  • Frage

  • Nach wie vor verwende ich VC++ 6.0
    Langsam fange ich echt an an mir zu zweifeln.
    BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) 
    {
      BSAEvent e;
      e.sig   = LOWORD(wParam);
      e.param = LOWORD(lParam);
    
      qsystem.dispatch(&e);
    
      return CFrameWnd::OnCommand(wParam, lParam);
    }
    Bei return kracht es.
    Ersetze ich das den return einfach mit return true dann kommt die Assertion nicht, aber die funktionalität des Programms geht nicht (sprich die Messages die ich aus einem Popup sende werden nicht verarbeitet)

    Callstack :

    NTDLL! 7c91120e()
    _CrtDbgReport(int 0x00000002, const char * 0x5f4cccf0, int 0x00000813, const char * 0x00000000, const char * 0x00000000) line 353
    MFC42D! 5f476b1f()
    MFC42D! 5f42fa82()
    MFC42D! 5f4627a6()
    CMainFrame::OnCommand(unsigned int 0x00000017, long 0x00000001) line 190
    MFC42D! 5f42ed05()
    MFC42D! 5f42ec88()
    MFC42D! 5f42c829()
    MFC42D! 5f42ccc5()
    MFC42D! 5f49021d()
    USER32! 7e368734()
    USER32! 7e368816()
    USER32! 7e3689cd()
    USER32! 7e368a10()
    USER32! 7e377721()
    USER32! 7e3749c4()
    USER32! 7e38a956()
    USER32! 7e38a2bc()
    USER32! 7e3b63fd()
    USER32! 7e3b64a2()
    USER32! 7e3a0877()
    USER32! 7e3a082f()
    __crtMessageBoxA(const char * 0x0012b930, const char * 0x1024e89c `string', unsigned int 0x00012012) line 65
    CrtMessageWindow(int 0x00000002, const char * 0x5f4cccf0, const char * 0x0012ca64, const char * 0x00000000, const char * 0x0012ea88) line 520 + 22 bytes
    _CrtDbgReport(int 0x00000002, const char * 0x5f4cccf0, int 0x00000813, const char * 0x00000000, const char * 0x00000000) line 419 + 76 bytes
    MFC42D! 5f476b1f()
    MFC42D! 5f42fa82()
    MFC42D! 5f4627a6()
    CMainFrame::OnCommand(unsigned int 0x00000014, long 0x00000001) line 190
    MFC42D! 5f42ed05()
    MFC42D! 5f42ec88()
    MFC42D! 5f42c829()
    MFC42D! 5f42ccc5()
    MFC42D! 5f49021d()
    USER32! 7e368734()
    USER32! 7e368816()
    USER32! 7e3689cd()
    USER32! 7e3696c7()
    MFC42D! 5f4397cb()
    MFC42D! 5f438e20()
    MFC42D! 5f439ad4()
    MFC42D! 5f43360e()
    WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f23, int 0x00000001) line 30
    WinMainCRTStartup() line 330 + 54 bytes
    KERNEL32! 7c817077()
    • Bearbeitet TH-Chris Freitag, 14. August 2009 05:41 Add sourcecode
    Donnerstag, 13. August 2009 14:24

Antworten

  • Wenn Du sie falsch benutzt, dann hast Du ein Problem nicht die MFC? ;)

    Was machst Du denn?

    Grundsätzlich: Der Zugriff auf CWnd Zeiger aus anderen Thread ist nicht erlaubt. Glieches gilt für GDI Objekte und alle anderen Objekte die aus der WINAPI über ein Handle gewrapped werden.

    Meistens erhälst Du ASSERTs in denen geprüft wird ob das Handle, dass Du verwendest gültig ist. Dazu musst Du immer den ersten ASSERT verfolgen, der eintritt. In Deinen Stacktraces löst ein ASSERT meistens einen zweiten aus.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 19. August 2009 06:00
    Moderator
  • Ich habe gerade einen Artikel geschrieben, der es ermöglicht, dass ASSERTs direkt einen DebugBreak auslösen.
    Da Deine Callstacks immer relativ komplex aussehen, könnte Dir das helfen.
    http://blog.m-ri.de/index.php/2009/08/30/vs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert/


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 2. September 2009 08:03
    Moderator

Alle Antworten


  • Wie sieht Dein Eintrag in der Message-Map aus?
    Vermutlich passt die Signatur nicht.

    1. Es wäre etwas einfacher, wenn Du dafür sorgen würdest, dass Debug-Symbole vorhanden sind zu Deiner MFC42D.DLL!
    2. Wenn Du im Callstack, schon zwei Einträge zu _CrtDbgReport findest, dann kann Dein System schon die ASSERTs nicht korrekt auf den Monitor bringen. Schu Dir Text und Zeile des ersten _CrtDbgReport an.
    3. Kannst Du einen Breakpoint setzen und in die MFC debuggen um zu sehen wo es kracht.
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 14. August 2009 06:01
    Moderator
  • wenn ich das könnte hätte ich es getan. weiss nicht warum die Symbole nicht vorhanden sind. mfc42d.pdb Dateien sind vorhanden.
    Kann es sein das die versionen nicht übereinstimmen oder so, das das probleme macht? Ich arbeite wie gesagt mit Vc++ 6.0 und dem Windows SDK2003 (February)

    Freitag, 14. August 2009 06:34
  • Das SDK spielt keine Rolle.
    Sind die Dateien vom selben Datum? Liegen beide im Windows\System32?
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 14. August 2009 07:16
    Moderator
  • mfc42.dll       28.02.2006
    mfc42.pdb     15.07.2007

    mfc42d.dll     15.07.2000
    mfc42.d.pdb  15.07.2000
    Freitag, 14. August 2009 07:20
  • Die bei der Release Versin passt auch nicht offensichtlich.
    Sicher, dass die Datei mfc42.d.pdb  heißt? Denn das wäre falsch.
    Liegt die pdb Datei im selben Verzeichnis?

    Was ist mit Deinem Problem?
    Wie steht es mit dem Messagemap Eintrag?
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 14. August 2009 07:57
    Moderator
  • ups..vertippt. heisst natürlich mfc42d.pdb
    Die datei liegt im selben verzeichnis wie die dll.
    ???verstehe leider nur bahnhof. Es gibt noch eine mfc42d.map Datei die ist einen Monat älter. Hab es auch geschafft mal dur die MFC zu debuggen, aber da passt nichts zusammen.
    Freitag, 14. August 2009 08:02
  • Dann installiere noch mal das letzte Service Pack.

    Kann es sein, dass qsystem.dispatch den Stack zerstört.
    Was passiert, wenn Du diese Funktion auskommentierst?
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 14. August 2009 10:05
    Moderator
  • Was passiert wenn Du  qsystem.dispatch(&e); auskommentierst.
    Zerstört diese Funktion evtl. den Stack?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 14. August 2009 12:20
    Moderator
  • Habe das letzte ServicePack für VC++ 6.0 installiert und es passiert nichts.
    Nein gibt den selben Fehler und der Stack sieht auch gleich aus.

    Ich habe so langsam das Gefühl das einfach mein System völlig durcheinander ist. Befindet sich leider auf einer VM die nicht von mir aufgesetzt wurde.


    Freitag, 14. August 2009 12:44
  • kann es sein das MFC oder CRT mit threading probleme hat???
    Dienstag, 18. August 2009 12:23
  • Wenn Du sie falsch benutzt, dann hast Du ein Problem nicht die MFC? ;)

    Was machst Du denn?

    Grundsätzlich: Der Zugriff auf CWnd Zeiger aus anderen Thread ist nicht erlaubt. Glieches gilt für GDI Objekte und alle anderen Objekte die aus der WINAPI über ein Handle gewrapped werden.

    Meistens erhälst Du ASSERTs in denen geprüft wird ob das Handle, dass Du verwendest gültig ist. Dazu musst Du immer den ersten ASSERT verfolgen, der eintritt. In Deinen Stacktraces löst ein ASSERT meistens einen zweiten aus.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 19. August 2009 06:00
    Moderator
  • warum funktioniert das ganze aber im Release ohne probleme nur debuggen kann ich es nicht?
    Dienstag, 1. September 2009 12:13
  • Weil ASSERTs nur im Debug Code drin sind. Es sind Prüfpunkte.
    Dein Codeverstößt gegen eine elementare Regel und deshalb der ASSERT!
    Aber ein Ignorieren eines ASSERT wird Dir früher oder später ein undefiniertes Verhalten oder gar einen Crash in Deinr Anwednung einbringen.
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Dienstag, 1. September 2009 14:45
    Moderator
  • alles klar, danke. Ist leider nicht mein Code und so richtiog auskennen tue ich mich da leider nicht, aber werde ich mal versuche etwas zu finden wie ich das lösen kann.
    Mittwoch, 2. September 2009 05:03
  • Ich habe gerade einen Artikel geschrieben, der es ermöglicht, dass ASSERTs direkt einen DebugBreak auslösen.
    Da Deine Callstacks immer relativ komplex aussehen, könnte Dir das helfen.
    http://blog.m-ri.de/index.php/2009/08/30/vs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert/


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 2. September 2009 08:03
    Moderator