Benutzer mit den meisten Antworten
erneutes Problem mit Debug Assertion Failed (wincore.cpp, Line 2067)

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
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- Als Antwort markiert Martin RichterModerator Mittwoch, 23. Juni 2010 11:30
-
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- Als Antwort markiert Martin RichterModerator Mittwoch, 23. Juni 2010 11:29
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 -
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)
-
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 -
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. -
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.
-
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- Als Antwort markiert Martin RichterModerator Mittwoch, 23. Juni 2010 11:30
-
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 -
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- Als Antwort markiert Martin RichterModerator Mittwoch, 23. Juni 2010 11:29