Nach Prozedurende erfolgt absturz
-
Hallo,
ich habe eine MFC Anwebndung in C++ geschrieben wo eingegebene Werte in die Datenbank geschrieben werden ...beim folgenden Debuggen funktioniert soweit alles ... es werden die Werte richtig in vom Dialog eingelesen und auch korrekt in die Datenbank geschrieben. Doch dannach stürtzt mein Programm nach dieser Stelle ab #:
void setData::OnOk(){
CDialog::OnDialog();
...
...
...
SaveData(); // Eintrag in Datenbank ** Funktioniert**
CDialog::OnOk();
}#... und beim beenden dieser Prozedur OnOk() stürzt mein Programm ab mit folgender Meldung:
Benuzerdefinierter Haltepunkt aus Quellcode aufgerufen bei 0x....
Das bedeutet doch das etwas in leere Verweist...???

-
Es bedeutet zum Beispiel, dass Deine Funktion SaveData evtl. den Stack zerstört.
-
Aber die SaveData() funktioniert ja, erst nach CDialog::On Ok(); und nach der geschweiften Klammer zu tritt der Fehler auf... den beim weiteren Debuggen springt die Deassemblierung an und er läuft bis zu der oben genannten Fehlermeldung.
-
Eben nicht. Schau Dir mal immer den Callstack an, wenn Du durch SaveData traced bzw. aus dieser Funktion returnierst.
-
Ich habe mir den Call Stack angeschaut, jedoch weiß ich nicht was dort geschieht bzw. wie ich das interpretieren soll? Nach welchen Verhalten muss ich schauen, damit ich weiß was dort schief geht.
Ich denke mal der Call Stack ist dafür da, damit gesehen werden kann, wer irgentetwas aufruft ... also wer wen aufruft.
Mit System.Diagnostics.StackTrace ist es irgentwie auch möglich auf den Call Stack zuzugreifen.
Kann mir hierzu jemand näheres erklären?
-
Genau! Der Callstack zeigt an wer wen aufruft und wohin zurückgesprungen wird.
In dem Moment in dem Dein Problem auftritt ist der zeigt Dein Callstack keine gültigen Infos mehr und der return einer Funktion erfolgt ben auf eine ungültige Adresse weil die "richtige" Adresse durch überschrieben des Stacks zerstört wurde.Also beobachte den Callstack ob sich darin eben was ändert.
-
Danke für die schnelle Antwort ... versuche jetzt noch mal mein Glück mit dem Call Stack!!!
-
Ich habe das Problem mit dem Callstack neu untersucht und nun mal die SaveData() Methode einfach auskommentiert (das ist die Methode die korrekt in die Datenbank schreibt), jedoch stürzt das Programm trotzdem ab. Also kann die SaveData() Methode als Verursacher ausgeschlossen werden.
---------------------------------------------------------------------------------------------------
void CTestDoc::InsertZeichenDialog(){
SetData sd;
if(sd.DoModal() == IDOK)
sd.OnOk();
-- hier kommt das Programm nicht mehr vorbei, es stürzt vorher ab!
}---------------------------------------------------------------------------------------------------
void SetData::OnOk(){
CDialog::OnDialog();
CString test;m_zeichen.GetWindowText(zeichen);
m_ray.m_strZeichen = zeichen;
//SaveData(); -- trotz Auskommentierung stürzt das Programm ab
CDialog::OnOk();
}
---------------------------------------------------------------------------------------------------Call Stack vor dem Absturz:
MFC42! 7c9039284
CTestDoc::InsertZeichenDialog() line…+…byteshier müsste es eigentlich weiter
MFC42! … gehen
MFC42! …
MFC42! …
MFC42! …
USER32! …
USER32! …
USER32! …
MFC42! …Nach dem Absturz sieht der Callstack so aus:
NTDLL! …
NTDLL! …
NTDLL! …
NTDLL! …
MSVCRT! …
CObject::operator delete(void * 0x….) line…+…bytes
SetData:: ‘scalar deleting destructor’(unsigned int 0x00000001) + …bytes
SetData::PostNcDestroy()line … + … bytes
MFC42!
MFC42!
MFC42!
MFC42!
MFC42!
USER32!
USER32!
USER32!
MFC42!Kann jemand etwas aus dem Callstack heraussehen was mir weiterhelfen könnte???
-
Kann es sein, dass etwas 2. mal gelöscht wird (mit delete)?
Simon
-
Meiner Meinung nach kann es nicht sein, dass ich etwas 2.Mal gelöscht habe.
In SaveData() mache ich ein SafeDelete(pointer) von dem Pointer mit dem Datenbankobjekt, das heißt das passt auf jeden Fall und es ist ja auch auskommentiert und ansonsten erzeuge ich ja kein Objekt mit new().
-
void CTestDoc::InsertZeichenDialog(){ SetData sd; if(sd.DoModal() == IDOK) sd.OnOk(); -- hier kommt das Programm nicht mehr vorbei, es stürzt vorher ab! }Das ist doch vollkommener Unsinn.
Du erzeugst enen Dialog auf dem Stack. Wenn der Dialog aus DoModal zurückkehrt isr der Diaog natürlich sachon abgearbeitet, dass heißt m_hWnd ist NULL. der Aufruf von sd.OnOK(); muss zum Crash führen!
-
Meiner Meinung nach kann es nicht sein, dass ich etwas 2.Mal gelöscht habe.
In SaveData() mache ich ein SafeDelete(pointer) von dem Pointer mit dem Datenbankobjekt, das heißt das passt auf jeden Fall und es ist ja auch auskommentiert und ansonsten erzeuge ich ja kein Objekt mit new().ich habe dann mal in der SetData::OnOk() alles rausgeworfen außer OnDialog() OnOk() aufrufe und es erfolgt trotzdem der gleiche Fehler.
void SetData::OnOk(){
CDialog::OnDialog();CDialog::OnOk();
}Nur wenn die Methode leer bleibt, dann tritt wie erwartet keinerlei Fehler auf!
-
Ok klingt verständlich denke mal genauer drüber nach, hatte deine Nachricht noch nicht gesehen!
-
Ja, du hast recht ... Danke! ... weißt du wie dieser Dialogaufruf fehlerfrei gestaltet werden kann?
-
ich habe jetzt sd.OnOk(); weggelassen und dann funktioniert es natürlich. Danke für die Hilfe ich habe es nicht mehr gesehen...
-
Hab mich zu Früh gefreut, leider ist immer noch das gleiche Verhalten erkennbar, das Programm stürzt an der genannten Stelle ab und kehrt auch nicht aus DoModal() Aufruf zurück.
-
Also aufgerufen wird dein Dialog noch korrekt oder? Dann auf einen Klick auf den OK-Button stürzt es ab? Hast du an dem OK Button was verändert, also zB eine OnOK-Funktion direkt zum Dialog hinzugefügt die aufgerufen wird oder ist das noch der normale OK-Button der vom Assistent eingefügt wird?
-
Also ich kann mir nicht vortsllen, dass diese Fehler nbicht in der Debug Version zu einem ASSERT geführt haben...
Bekommst Du wirklich keinen ASSERT?
-
Ja der Dialog wird korrekt aufgerufen und nach der OnOK() Methode meiner SetData Klasse bleibt der Debugger mit der Fehlermeldung stehen:
Benuzerdefinierter Haltepunkt aus Quellcode aufgerufen bei 0x....
Noch mal zusammenfassend:
void CTestDoc::InsertZeichenDialog(){
SetData sd;
sd.DoModal();
-- diese Stelle erreicht mein Programm nicht mehr, es stürzt vorher ab!
}void SetData::OnOk(){
CDialog::OnOk();
}Prinzipieller Ablauf von dem ich ausgehe:
Mit einem angelegtem Objekt… .doModal(); aufrufen, dies öffnet den Dialog.
Wenn nun dieser Dialog mit einem Klick auf den OK Button beendet wird, dann befindet sich das Programm in der OnOK() Methode. Der Aufruf CDialog::OnOK(); in der OnOK() Methode schließt dann den Dialog wieder und der Programmablauf geht nach doModal() weiter.
-
Ich habe jetzt noch mal in der SetData Klasse nach vorhandenen Störquellen gesucht und dabei ist mir diePostNcDestroy() Methode die mein Vorgänger eingefügt hat aufgefallen, ich hab sie daraufhin auskommentiert und nun stüzt mein Programm nicht mehr ab. Es funktioniert jetzt, aber ich kann den Zusammenhang nicht nachvollziehen???
Was ich momentan weiß ist, dass er nach dem beenden der OnOk() Methode in die PostNcDestroy() hineinsteigt.