unbekannte Fehlermeldung
-
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.