unbekannte Fehlermeldung
-
Hallo
Ich habe gerade ein paar kleine Änderungen an meinem Programm getätigt und es funktioniert auch gut. Wenn ich das Programm aber mit dem kleinen roten Kreuz in der rechten oberen Ecke schließen will, bekomme ich eine Fehlermeldung aus der ich nicht schlau werde:
Unhandled exception at 0x7c22df1f (mfc71d.dll) in Kniffel.exe: 0xC0000005: Access violation reading location 0xcccccccc.
Das Programm zeigt dann immer auf folgende Zeile im Quellcode (wincore.cpp):
else //_AFX_NO_OCC_SUPPORT if ((m_hWnd != NULL) || (m_pCtrlSite != NULL)) { if (m_pCtrlSite == NULL) bResult = ::DestroyWindow(m_hWnd); else :arrow_right: bResult = m_pCtrlSite->DestroyControl(); }
Weiß vielleicht jemand von Euch, was ich hier machen kann und was dieser Fehler bedeutet?
chrische
-
Ich vermute mal das er an dieser Stelle über die Funktion auf einen Speicherbereich zugreifen will (wahrscheinlich löschen) und dieser nicht mehr vorhanden ist.
Überprüf mal im Debugger auf welchen Speicherbereich verwiesen wird und was für ein Inhalt dort vorhanden ist.
-
Hallo
Ich habe ehrlich gesagt keine Ahnung, wie so etwas funktioniert. Der zeigt mir in einem Fenster ein ganzen Haufen Zeug an, mit dem ich nicht viel anzufangen weiß:
bResult 0 int
+ m_pCtrlSite 0xcccccccc {COleControlSite} COleControlSite *
+ this 0x0012fe60 {CButton hWnd=0x00000000 {unused=??? }} CWnd * constIch weiß, dass man eigentlich mit dem Debugger umgehen können muss, aber ich habe bei meinen kleinen Programmen den Fehler immer ohne Hilfe des Debuggers gefunden.
chrische
-
Schau dir mal den komischen Wert an:
m_pCtrlSite 0xcccccccc {COleControlSite} COleControlSite *
-
Hallo
Ich hoffe, dass Ihr mir das glaubt, aber diesen Wert fand ich auch komisch und habe Ihn mir näher angeschaut, leider ohne zu kapieren, was wirklich abgeht und vor allem woher der Fehler kommt. Ich habe jetzt einfach auf das Plus geklickt und habe folgende Anzeigen:
bResult 0 int
- m_pCtrlSite 0xcccccccc {COleControlSite} COleControlSite *
+ CCmdTarget {CCmdTarget} CCmdTarget
+ m_pCtrlCont CXX0030: Error: expression cannot be evaluated COleControlContainer *
+ m_hWnd CXX0030: Error: expression cannot be evaluated HWND__ *
+ m_pWndCtrl CXX0030: Error: expression cannot be evaluated CWnd *
m_nID CXX0030: Error: expression cannot be evaluated unsigned int
+ m_rect {top=??? bottom=??? left=??? right=???} CRect
+ m_iidEvents {????????-????-????-????-????????????} _GUID
+ m_pObject CXX0017: Error: symbol "" not found IOleObject *
+ m_pInPlaceObject CXX0017: Error: symbol "" not found IOleInPlaceObject *
+ m_pActiveObject CXX0017: Error: symbol "" not found IOleInPlaceActiveObject *
+ m_pWindowlessObject CXX0017: Error: symbol "" not found IOleInPlaceObjectWindowless *
m_dwEventSink CXX0030: Error: expression cannot be evaluated unsigned long
m_dwPropNotifySink CXX0030: Error: expression cannot be evaluated unsigned long
m_dwStyleMask CXX0030: Error: expression cannot be evaluated unsigned long
m_dwStyle CXX0030: Error: expression cannot be evaluated unsigned long
m_dwMiscStatus CXX0030: Error: expression cannot be evaluated unsigned long
m_bIsWindowless CXX0030: Error: expression cannot be evaluated int
+ m_ctlInfo {cb=??? hAccel=??? cAccel=??? ...} tagCONTROLINFO
m_bIgnoreNotify CXX0030: Error: expression cannot be evaluated int
m_dwNotifyDBEvents CXX0030: Error: expression cannot be evaluated unsigned long
+ m_pDataSourceControl CXX0017: Error: symbol "" not found CDataSourceControl *
+ m_pBindings CXX0017: Error: symbol "" not found CDataBoundProperty *
+ m_pDSCSite CXX0030: Error: expression cannot be evaluated COleControlSite *
m_ctlidRowSource CXX0030: Error: expression cannot be evaluated unsigned short
m_defdispid CXX0030: Error: expression cannot be evaluated long
m_dwType CXX0030: Error: expression cannot be evaluated unsigned int
+ m_strDataField {???} ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > >
m_bIsDirty CXX0030: Error: expression cannot be evaluated int
+ m_varResult {???} tagVARIANT
+ m_dispDriver {m_lpDispatch=??? m_bAutoRelease=??? } COleDispatchDriver
+ m_pDC CXX0030: Error: expression cannot be evaluated CDC *
+ m_xOleClientSite {...} COleControlSite::XOleClientSite
+ m_xOleIPSite {...} COleControlSite::XOleIPSite
+ m_xOleControlSite {...} COleControlSite::XOleControlSite
+ m_xAmbientProps {...} COleControlSite::XAmbientProps
+ m_xPropertyNotifySink {...} COleControlSite::XPropertyNotifySink
+ m_xEventSink {...} COleControlSite::XEventSink
+ m_xBoundObjectSite {...} COleControlSite::XBoundObjectSite
+ m_xNotifyDBEvents {...} COleControlSite::XNotifyDBEvents
+ m_xRowsetNotify {...} COleControlSite::XRowsetNotify
+ _interfaceEntries 0x7c1615b0 struct AFX_INTERFACEMAP_ENTRY const * const COleControlSite::_interfaceEntries const AFX_INTERFACEMAP_ENTRY [10]
+ interfaceMap {pfnGetBaseMap=0x7c23b390 CCmdTarget::GetThisInterfaceMap(void) pEntry=0x7c1615b0 struct AFX_INTERFACEMAP_ENTRY const * const COleControlSite::_interfaceEntries } AFX_INTERFACEMAP
+ this 0x0012fe60 {CButton hWnd=0x00000000 {unused=??? }} CWnd * constIch werde leider nicht daraus schlau.
Danke für Eure Hilfe.
chrische
-
Ich würde mal sagen, das was du da löschen willst wurde schon gelöscht - hat guenni ja auch schon vermutet.
Leider weiß ich nicht, wie du die Stelle finden kannst.
Ich würde als erstes einen Breakpoint auf die Zeile setzen, wo es knallt und gucken, ob ich da vielleicht vorher schon mal lang komme.
Und dann im Callstack hochklettern und gucken, ob weiter oben schon einer aufräumt.
-
Hallo
Danke für die Antworten. Leider kann ich Euch (vor allem aber estratu_de) nicht folgen. Wie kann denn das Fenster schon gelöscht wurden sein, wenn ich noch in ihm arbeite. Alles funktioniert doch tadellos, nur das Beenden des Fensters macht Probleme. Ich habe mal einen Breakpoint vor die Anweisung in der wincore.cpp gesetzt und er ist erst dann abgestürzt, als ich alles weiterlaufen lassen habe. Bis zu diesem Punkt klappt also alles. Was sagt mir denn der Callstack? Ich bin wirklich etwas ratlos.
chrische
-
hallo
das liegt an den "grundlagen".
es kommt gerne vor, dass programmierer einen bereich alloziieren (mit new) und den dann wieder freigeben (delete). so soll es sein.
nun ist c++ eine "gefährliche" sprache.. ein dschungel.. denn: es gibt keine sicherheit, dass, wenn man einen bereich schon freigegeben hat mit delete, dieser dann nicht doch noch zugreifbar ist. (so scheint es bei dir zu sein.. du greifst auf einen schon freigebenen bereich zu, aber weil da noch nix anderes liegt, passiert nix böses .. du merkst es nicht).
aber wenn man den bereich dann nochmal freigibt (also doppelt gemopelt), dann erst stürzt alles ab...
sei froh, dass es jetzt auffällt. sowas nennt man laufzeitfehler.. es sind die am schwersten zu findenden fehler..
und du musst ihn jetzt suchen.
(klar, erstmal nur eine vermutung, aber eine wahrscheinliche
)
-
Hallo
Danke für die phantasiereiche Erläuterung. Ich habe leider keinerlei Speicher bewusst mit new reserviert und somit auch keinen Speicher mit delete wieder freigeben können.
chrische
-
estartu_de schrieb:
Ich würde als erstes einen Breakpoint auf die Zeile setzen, wo es knallt und gucken, ob ich da vielleicht vorher schon mal lang komme.
Und dann im Callstack hochklettern und gucken, ob weiter oben schon einer aufräumt.Hast du das schon versucht?
Oder hast du das gemeint, was du von mir nicht verstanden hast?Wenn du nicht fragst, wird dir das auch nicht erklärt.
-
Hallo
Ich habe einen Breakpoint gesetzt und musste feststellen, dass er beim runterfahren zum ersten Mal an diese Stelle kommt. Ich habe das mit dem Callstack nicht verstanden. Ich habe jetzt mal versucht die Releaseversion zu starten und habe folgende Warnung bekommen:_
Kniffel warning LNK4089: all references to 'OLEAUT32.dll' discarded by /OPT:REF
Sonst ist es auch da dasselbe. Das Programm funktioniert bis zum Programmabbruch einwandfrei.
Danke füür Eure Hilfe
chrische
-
Nimm mal erstmal wieder die Debugversion, die ist ja fürs Fehlersuchen gedacht.
Dann muss ich noch wissen:
VC6 oder 7?
Scheint ja eine englische Version zu sein.
-
Hallo
Man das geht wirklich richtig schnell. Ich habe die 2003 .net Version in Englisch.
chrische
-
Okay, dann lauf mal auf den Breakpoint auf und schau dann in das Fenster, wo du die ganzen Ausgaben sehen kannst.
Ich habe da unten solche Tabs und der ganz linke ist "Aufrufliste" also "Callstack".
Da siehst du jetzt, welche Funktionen welche mit welchen Werten aufrufen.Die letzte Funktion steht ganz oben.
Durch Doppelklick auf eine Zeile springst du an die passende Stelle im Quellcode.Achja: Lies mal: http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vsdebug/html/_asug_How_Do_I_Topics3a_Debugging.asp
-
Hallo
Ich habe mal versucht zu machen, was du mir geraten hast.
1. Breakpoint an kritische Stelle
2. Programmm ausgeführt
3. Programm beendet
4. Programm stoppt am Breakpoint
5. Zum Callstack und auf lezte Funktion (mfc71d.dll!CWnd::DestroyWindow() Line 990 C++
)
doppelklick-> Dabei springt er immer an die Stelle im Quellcode, an dem ich bereits den Breakpoint habe
6. Doppelklick auf vorletzte Funktion (> mfc71d.dll!CButton::~CButton() Line 70 C++
)-> dort komme ich zum Destruktor von CButton und in diesem steht:
CButton::~CButton() { DestroyWindow(); }
Ich habe wirklich keine Ahnung, aber da steht zweimal was mit DestroyWindow vielleicht ist das ja das Problem?
chrische
P.S.:Danke für den Link
-
Geh doch mal so weit höher, bis du wieder in deinem Quellcode bist und nicht in dem der MFC.
Fehler in der MFC sind extrem unwahrscheinlich, auch wenn Neulinge (nix gegen dich) gerne meinen, dass es da von Fehlern nur so wimmelt.Das mit dem zweimal DestroyWindow ist logisch:
CButton ist von CWnd abgeleitet. Also nimmt der das DestroyWindow vom CWnd, weil CButton keins hat. (OOP Grundlagen)Hangel dich mal höher und frag wieder. So halbwegs krieg ich das noch erklärt hoffe ich.
-
Hallo
Danke für deine Hilfe. Du kannst ruhig Neuling zu mir sagen. Ich glaube ich kann einchätzen, dass ich kein wirklicher Programmierfreak bin. Ich habe mich nun im Callstack hoch gearbeitet und lande hier:
> Kniffel.exe!CKniffelDlg::~CKniffelDlg() + 0x4d C++
Diese Funktion wollte ich doppelt anklicken und bekam aber diese eine MessageBox mit der Meldung:
There is no source code available for the current location.
Da es sich doch, glaube ich, um einen Destruktur handelt, kann es doch nicht gut sein, wenn er mir diesen nicht zeigen kann. Habe ich diesen vielleicht gelöscht?
Es tut mir leid, dass ich dich hier frage wie ein kleines Kind, aber ich glaube, dass sich so Kinder fühlen müssen.Nächste Funktion:
Kniffel.exe!CKniffelApp::InitInstance() Line 85 + 0x1c C++
bei doppelklick:
else if (nResponse == IDCANCEL) { // TODO: Fügen Sie hier Code ein, um das Schließen des // Dialogfelds über "Abbrechen" zu steuern } // Da das Dialogfeld geschlossen wurde, FALSE zurückliefern, so dass wir die // Anwendung verlassen, anstatt das Nachrichtensystem der Anwendung zu starten. return FALSE; }
Was hat das nun alles zu bedeuten?
chrische
-
Hallo
Ich glaube ich habe den Fehler gefunden:
Ich habe einfach bei meiner Klasse CKniffelDlg einen Destruktor hinzugefügt, weil diesen keinen hatte. Vielleicht habe ich ihn aus Versehen gelöscht, weil der doch eigentlich automatisch angelegt wird. Beim ersten Compilieren hat das hingehauen, weil er immer gemeckert hat, dass dieses ~CKniffelDlg bereits in der Kniffel.obj definiert ist. Also habe ich das Projekt noch einmal komplett neu bauen lassen und siehe es funktioniert. Ich danke dir sehr für deinen Hilfe und werde das nächste Mal vielleicht alleine mit dem Debugger umgehen können. Falls sich doch noch einmal was verändern sollte, melde ich mich wieder.
chrische
-
Also, eines hatte ich noch vergessen zu erwähnen, aber der Lerneffekt ist wohl eh besser, wenn man selber drüber fällt:
Außer in der Funktion ganz oben steht der grüne Pfeil immer HINTER der Anweisung, die gerade dran ist.In der InitInstance ist also eigentlich die Zeile mit DoModal dran. (Was das macht weißt du? Sonst frag.)
Hat dein Dialog einen Destruktor?
Ich vermute "nein", denn der wird nicht automatisch erstellt. Dann kann es gut sein, dass er sich beim Springen in den Destruktor von CDialog verhaspelt.
Grundlageneinschub: Wenn eine Klasse eine Funktion nicht hat wird die der Basisklasse aufgerufen. (Die muss die haben, sonst würde es nicht kompilieren.)
Okay, das war jetzt nur so grob, aber für alles andere gibts C++ Bücher.Wenn du dich schon wie ein Kind fühlst, dann denk immer dran: Wer nicht fragt...
-
Vielleicht hätte auch das komplett neu bauen alleine gereicht.
Ich dachte in der Version 7 ist der Fehler behoben.Also: Wenn du unerklärliche Fehler egal welcher Art hast - drück "Alles neu erstellen" und zu 90% ist die Welt wieder in Ordnung.
Aber wenigstens kannst du jetzt besser debuggen.