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