Cos Geschrieben 5. September 2005 Geschrieben 5. September 2005 [EDIT: Abgelöst von Haltepunkte | Klotzkopp] genau die taste war es :-) aber ich habe mal eine Frage wegen einem Haltepunkt den VC selber erstellt und zwar wenn ein Heap-Fehler auftritt. Kann mir vielleicht jemand sagen wo ich den Fehler suchen muss wenn der Fehlercode folgendermaßen heißt...: HEAP[box.exe]: Invalid Address specified to RtlValidateHeap( d00000, 12b9b0 ) Leider weiß ich überhaupt nicht wann dieser Fehler das erste mal erschienen ist und was ich zu dem Zeitpunkt geändert habe, da ich dauernd mit dem Debugger gearbeitet habe und nie das Programm bis zum Ende hab laufen lassen, und dieser Fehler erscheint wenn das Programm eigentlich schon vorbei ist. Die Meldung von VC lautet (also eine AFX-Box erscheint) Benutzerdefinierter Haltepunkt aus Quellcode aufgerufen bei 0x778813b1 danke Zitieren
Klotzkopp Geschrieben 5. September 2005 Geschrieben 5. September 2005 Benutzt du DLLs? Falls ja, hast du bei den DLLs und beim Hauptprogramm dieselbe Version der Laufzeitbibliothek benutzt? Zitieren
Cos Geschrieben 5. September 2005 Autor Geschrieben 5. September 2005 Nein ich benutze keine DLL´s. Das hatte ich auch schon mal gesehen dass das ein bekannter Fehler ist wenn man DLL´s benutzt, aber ich habe keine... Zitieren
Klotzkopp Geschrieben 5. September 2005 Geschrieben 5. September 2005 Dann gibst du einen Zeiger an free/delete, den du nicht mit malloc/new bekommen hast. Möglicherweise hast du den Zeiger geändert (inkrementiert, neu zugewiesen), oder du schreibst irgendwo in deinem Code über eine Arraygrenze hinaus und änderst damit einen solchen Zeiger. Zitieren
Cos Geschrieben 5. September 2005 Autor Geschrieben 5. September 2005 Sind das diese "wilden" Zeiger? Na dann wir das ja einen Spass den zu suchen... kann ich den mit der Fehlermeldung in dem dazugehörenden 0x...Code was anfangen. Gibts da einen Anhaltspunkt wo ich mit der Suche beginnne kann. Weil der stoppt beim Debugger nicht im Text-QuellCode sondern in den Assembler-Bereich und da suche ich ja bis in die Unendlichkeit... Zitieren
Klotzkopp Geschrieben 5. September 2005 Geschrieben 5. September 2005 Du kannst über den Callstack (auf deutsch Aufrufliste) sehen, wo der Aufruf herkam, der letztendlich zum Crash geführt hat. Das bringt dich aber nur dahin, wo der "schlechte" Zeiger freigegeben werden sollte. Zitieren
Cos Geschrieben 6. September 2005 Autor Geschrieben 6. September 2005 Ok habe den Fehler gefunden. er wird von einem CString verursacht der von einer Klasse an die andere übergeben wird. Welche Fehler kann ein CString verursachen? kann ein CString auch überlaufen? Zitieren
Klotzkopp Geschrieben 6. September 2005 Geschrieben 6. September 2005 CString kann theoretisch überlaufen, aber bevor das passiert, würde es wohl irgenwo anders knallen. Wahrscheinlicher ist, dass du irgendwo über eine Arraygrenze hinausschreibst und dabei den internen Zeiger des CString änderst. Zitieren
Cos Geschrieben 6. September 2005 Autor Geschrieben 6. September 2005 Also der CString wird eigentlich kaum genutzt. Er besorgt mir mit m_sInputConvert = m_ldFile.GetPathName(); den Pfad und dann übergebe ich ihn mit bool converton = TRUE; CABCboxDlg m_change; CDisplayConvert m_startconvertdisplay; m_change.OnRunabcsplit(m_sInputConvert, converton); m_change.OnRunabcwrap(m_sInputConvert, converton); m_startconvertdisplay.DoModal() an die 2 anderen Klassen. Dort wird lediglich eine andere Variable mit void CABCboxDlg::OnRunabcwrap(CString converterex, bool concheck) m_sOutput1.Format("%s%s%d%s", converterex, "_OP_", outputcount,".abc"); benannt. Habe versucht denn CString nach der Operation null-terminated zu machen, aber das hat nicht geholfen. Was funktioniert ist wenn ich den CString aus der Klasse rausnehme und die Übergabe sein lasse...aber ich brauch den CString da dort ein Pfad steht. Zitieren
Klotzkopp Geschrieben 6. September 2005 Geschrieben 6. September 2005 Der Fehler liegt nicht an diesem CString selbst, sondern vermutlich in der Benutzung der Variablen, die im Speicher davor oder dahinter stehen. Hat die Klasse, zu der m_sInputConvert gehört, noch andere Member? Wo erzeugst du die Instanz dieser Klasse? Zitieren
Cos Geschrieben 6. September 2005 Autor Geschrieben 6. September 2005 Nein die Klasse hat sonst keine andere Variablen, sie ist nur eine kleine Funktion die gestartet wird wenn der Button im fenster gedrückt wird. Der Code vom obigen Post ist der komplette. Es gibt noch 2 andere Funktionen eine Cancel und eine Durchsuchen, die die Datei speichert die ich benötige. Ich erzeuge keine Instanzen... Zitieren
Klotzkopp Geschrieben 6. September 2005 Geschrieben 6. September 2005 Ich erzeuge keine Instanzen...Unwahrscheinlich Das sind schon mal drei: bool converton = TRUE; CABCboxDlg m_change; CDisplayConvert m_startconvertdisplay;[/code]Eine Instanz von bool, eine von CABCboxDlg und eine von CDisplayConvert. Und irgendwo machst du das mit Sicherheit auch mit der Klasse, zu der m_sInputConvert gehört. Zitieren
Cos Geschrieben 6. September 2005 Autor Geschrieben 6. September 2005 ok geb mich geschlagen was du nicht immer alles über meine programme weißt... also die m_sInputConvert kommt nur in dem Code vor den du siehst und die Instanz ist in der ConvertOP.h mit CString m_sInputConvert. public: CString m_sInputConvert; CConvertOP(CWnd* pParent = NULL); // Standardkonstruktor in den anderen Klassen wohin sie kopiert wird erzeuge ich nichts mehr. die Klassen sind definiert mit afx_msg void OnRunmabcsplit(CString, bool); afx_msg void OnRunabcwrap(CString, bool); könnte der Fehler an dem afx_msg liegen? diesen teil habe ich von dem bestehenden Programm übernommen. Das würde vom Programmierer vorher geschreiben. Zitieren
Klotzkopp Geschrieben 6. September 2005 Geschrieben 6. September 2005 also die m_sInputConvert kommt nur in dem Code vor den du siehst und die Instanz ist in der ConvertOP.h mit CString m_sInputConvert.Das ist die Deklaration der Membervariablen. Wo legst du die Instanz von CCOnvertOP an? Wenn du möchtest (und es keine Probleme mit der Geheimhaltung gibt), kannst du mir auch das Projekt schicken und ich schau mal rein. Zitieren
Cos Geschrieben 6. September 2005 Autor Geschrieben 6. September 2005 so ich denke ich habe was gefunden. private: CConvertOP m_dConvertOP; Ist es was du sehen wolltest? void CABCboxDlg::OnConvert() { m_dConvertOP.DoModal(); } Ich darf leider keine großen Fragmente des Codes rausgeben...muss auch jedesmal den Code ändern wenn ich hier was poste (Namen von klassen etc.) Zitieren
Klotzkopp Geschrieben 6. September 2005 Geschrieben 6. September 2005 Hat CABCboxDlg noch andere Member? Gibt es im Code überhaupt irgendwelche Arrays, auf die über den Index zugegriffen wird? Zitieren
Cos Geschrieben 6. September 2005 Autor Geschrieben 6. September 2005 Hat CABCboxDlg noch andere Member? Aber Hallo....wenn ich die dir alle hinschreibe bin ich morgen noch dran. das sind mindestens 50 Membervariablen und 15 Funktionen. Gibt es im Code überhaupt irgendwelche Arrays, auf die über den Index zugegriffen wird? Es gibt ein paar Arrays die aber nicht in direkter Verbindung stehen mit dem m_sInputConvert. Es muss ja ein Fehler sein der mit dieser Variable in Verbindung gebracht wird. OH GOTT....jetzt fällt mir gerade noch was ein was ich vergessen habe zu schreiben :eek Das tut mir leid.... Und zwar taucht der Fehler nur auf wenn die Funktion CConvertOP nicht gestartet wird und der ganze Code oben nicht durchlaufen wird...also wenn m_sInputConvert --> converterex (so heißt der CString in der OnRunabcwarp) nicht "gefüllt" wurde.... entschuldige wenn du mir jetzt gerne den Hals umdrehen willst....war das wichtig? Zitieren
Klotzkopp Geschrieben 6. September 2005 Geschrieben 6. September 2005 Es gibt ein paar Arrays die aber nicht in direkter Verbindung stehen mit dem m_sInputConvert. Es muss ja ein Fehler sein der mit dieser Variable in Verbindung gebracht wird. Nein. Löse dich von dieser Vorstellung. Du versteifst dich darauf, dass der Fehler da passiert, wo er sich bemerkbar macht. Das muss aber nicht so sein. Und zwar taucht der Fehler nur auf wenn die Funktion CConvertOP nicht gestartet wird und der ganze Code oben nicht durchlaufen wird...CConvertOP ist eine Klasse, keine Funktion. Welchen Wert hat eigentlich der "schlechte" Zeiger? Zitieren
Cos Geschrieben 6. September 2005 Autor Geschrieben 6. September 2005 ich meinte die Funktion void CConvertOP::OnConvertgo() die wird nicht gestartet. und die ganze Klasse CConvertOP wird nicht durchlaufen wenn der Fehler auftritt. Also der Debugger sagt das converterex ohne das durchlaufen der CConvertOP und ohne ausführen von OnConvertgo den Wert {"€Z"} hat weiter ist angegeben, als Unterpunkt von converterex, m_pchData mit dem Wert 0x0012b9e0 was €Z entsprechen soll. und ich hätte gerne das converterx keine Informationen enthält wenn OnConvertgo nicht durchlaufen wird. Meinst du das es damit gehen könnte, wenn man converterex keine Wert zuweist? Zitieren
Cos Geschrieben 6. September 2005 Autor Geschrieben 6. September 2005 noch eine kleine Ergänzung. Habe versucht mal dem converterex einen anderenn Wert zuzuweisen und es passierte folgenedes: Als ersten Versuch. converterex = ""; // Programm läuft durch bis zum Heapfehler converterex ="test"; // Fehlermeldung beim Ausführen der Zeile : Debug Assertion Failed! Program :...\abcbox.exe File:strcore.cpp (die ich nicht mit eingebunden habe) Line:154 converterex.Format("%s%d", "",0); //gleiche Fehlerbeschreibung allerdings nun in Line 165 Also muss doch schon was bei der Deklaration der Variablen falsch sein wenn ich sie noch nichtmal ändern kann. Zitieren
Klotzkopp Geschrieben 7. September 2005 Geschrieben 7. September 2005 File:strcore.cpp (die ich nicht mit eingebunden habe) Line:154strcore.cpp ist eine Quellcodedatei der MFC: void CString::Release() { if (GetData() != _afxDataNil) { [B]ASSERT(GetData()->nRefs != 0);[/B] if (InterlockedDecrement(&GetData()->nRefs) <= 0) FreeData(GetData()); Init(); } } [/code] //gleiche Fehlerbeschreibung allerdings nun in Line 165 [code]void PASCAL CString::Release(CStringData* pData) { if (pData != _afxDataNil) { [B]ASSERT(pData->nRefs != 0);[/B] if (InterlockedDecrement(&pData->nRefs) <= 0) FreeData(pData); } } Zu diesem Zeitpunkt ist dieser CString intern schon "kaputt". Der Fehler passiert also früher. Zitieren
Cos Geschrieben 7. September 2005 Autor Geschrieben 7. September 2005 Hi Guten Morgen, das wurde mir gestern zu bunt und ich habe das Problem anders gelöst. ist zwar nicht sonderlich schön aber es geht und das ist das was zählt Habe nun eine Funtkion geschrieben für den Fall das der CString und der bool-wert benötigt wird und eine Funktion die ohne die Übergabe läuft. Und nun tritt der Fehler nicht mehr auf...Ist zwar bissl mehr Code aber was solls... Aber wie immer vielen Dank für deine Hilfe Wenn du denkst das dieser Thread noch jemand anderem nutzen kann, kannst du ihn online lassen...wenn nicht, lösch ihn wieder Danke Cos Zitieren
Klotzkopp Geschrieben 7. September 2005 Geschrieben 7. September 2005 Habe nun eine Funtkion geschrieben für den Fall das der CString und der bool-wert benötigt wird und eine Funktion die ohne die Übergabe läuft. Und nun tritt der Fehler nicht mehr auf...Da wäre ich sehr vorsichtig. Was du gemacht hast, ist offenbar eine Symptombehandlung. Der Fehler ist vermutlich noch da, aber du hast dafür gesorgt, dass er sich vorerst nicht mehr auswirkt. Womöglich überschreibst du jetzt eine andere Variable, bei der das nicht gleich auffällt. Vielleicht wirkt es sich erst dann aus, wenn du von Debug auf Release umstellst. Das ist gefährlich. Je länger du das tatsächliche Beheben dieses Fehlers vor dir herschiebst, desto teurer wird es. Zitieren
Cos Geschrieben 7. September 2005 Autor Geschrieben 7. September 2005 aber meinst du nicht das der fehler daher rühren kann das ich die funktion mit den zwei variablen angesprochen habe ohne dieses zwei variablen zu übergeben? Also es gab ja die funktion abc(cstring,bool) und die wurde angesprochen mit abc() und mit abc(cstring i, bool k) und wenn ich die variablen angeben habe gings wenn ich nur abc() aufgerufen habe kam der Fehler. Nun rufe ich die jeweilige funktion nur mit den variablen auf wenn ich sie brauche ansonsten nehme ich die abc(). ich hätte sowieso nicht gedacht das man eine Funktion die mit abc(Cstring, bool) definiert ist, mit abc() aufrufen kann. Ich dachte immer die funktion erwartet diese variablen... Zitieren
Klotzkopp Geschrieben 7. September 2005 Geschrieben 7. September 2005 aber meinst du nicht das der fehler daher rühren kann das ich die funktion mit den zwei variablen angesprochen habe ohne dieses zwei variablen zu übergeben?Du kannst eine Funktion, die zwei Parameter hat, nicht ohne Parameter aufrufen, Es sei denn, beide Parameter hätten Defaultwerte oder die Funktion hat eine variable Parameterliste (...). Wie sieht denn die Deklaration von abc aus? WICHTIGER NACHTRAG (sorry für's Schreien) Kann es sein, dass die diese Funktion (OnRunabcsplit) eine Nachrichtenbehandlungsfunktion für einen Button oder etwas in der Art ist? Und hast du die Parameter nachträglich hinzugefügt? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.