Frage

Ich bin mit meinem C ++ Programm in gdb. Ich bin wirklich nicht mit gdb erlebt, aber ich bin immer Nachrichten wie:

warning: HEAP[test.exe]:
warning: Heap block at 064EA560 modified at 064EA569 past requested size of 1

Wie kann ich die Spur zu kommen, wo dies bei geschieht? die Erinnerung Anzeigen gibt mir keine Hinweise.

Danke!

War es hilfreich?

Lösung

So können Sie Ihre Haufen sind Zerschlagung. Hier ist ein schönes GDB Tutorial zu halten Geist.

Meine normale Praxis ist eine Pause in bekannt gutem Teil des Codes einzustellen. Sobald er dort ankommt Schritt durch, bis Sie Fehler aus. Normalerweise können Sie das Problem auf diese Weise bestimmen.

Weil du einen Haufen Fehler immer davon ausgehen, ich würde es hat mit etwas, das Sie setzen sind auf dem Heap zu tun, damit ein besonderes Augenmerk auf Variablen zahlen (ich glaube, Sie Druck in GDB verwenden können sie Adressenspeicher zu bestimmen, und dass kann in der Lage sein, die Sie synchronisieren mit dem Ihr erroring out). Sie sollten auch bedenken, dass die Eingabe-Funktionen und die Rückkehr von Funktionen mit dem Heap spielen, so dass sie sein kann, wo Ihr Problem liegt (vor allem, wenn Sie Ihre Haufen durcheinander, bevor von einer Funktion zurückkehrt).

Andere Tipps

Sie können sich wahrscheinlich eine Funktion verwenden, ein „Beobachtungspunkt“ genannt. Das ist wie ein Bruchstelle aber der Debugger stoppt, wenn der Speicher modifiziert wird.

gab ich eine ungefähre Vorstellung darüber, wie diese zu verwenden, in einer Antwort auf eine andere Frage.

Wenn Sie andere Tools verwenden können, empfehle ich das Ausprobieren Valgrind . Es ist eine Instrumentierung Rahmen, die Ihren Code in einer Art und Weise ausgeführt werden können, dass sie, in der Regel zu können, an der genauen Anweisung stoppen, die den Fehler verursacht. Heap-Fehler sind in der Regel leicht zu finden, auf diese Weise.

Eine Sache, man kann versuchen, da dies die gleiche Art von Dingen wie der Standard-libc ist, mit dem MALLOC_CHECK_ envronment Variable konfiguriert (Mann libc).

Wenn Sie halten von GDB austritt (wenn Ihre Anwendung zu beenden, verwenden Sie „r“ nur um es erneut ausführen), können Sie Setup eine Speicherhaltepunkt an dieser Adresse „HBREAK 0x64EA569“, verwenden auch „Hilfe HBREAK“ konfigurieren Zustand des oder anderer breakpoitn aktivieren / deaktivieren Optionen übermäßig zu verhindern, dass die Unterbrechungs Eingabe ....

Sie können nur eine Protokolldatei konfigurieren, setzen log ... Setup einen Stack-Trace auf jeder Pause „Anzeige / bt -4“, drücken Sie dann r, und nur die Enter-Taste gedrückt halten, und lassen Sie es blättern durch „Oder c verwenden ## bis x-mal weiter ... etc ..“, schließlich werden Sie die gleiche Behauptung sehen, dann werden Sie jetzt haben (wegen der Anzeige / bt) ein Stacktrace mit dem Sie corolate zu welcher Code wurde modifiziert auf dieser Adresse ...

Ich hatte ähnliches Problem, wenn ich versuche, Array von Zeigern auf meine Strukturen realloc, sondern als Array von ints Ich war Neuzuweisung (weil ich den Code aus Tutorial bekam und vergessen, es zu ändern). Der Compiler wasnt mich zu korrigieren, weil es nicht, was in Größe Argumente überprüft werden kann. Meine Variable war:

itemsetList_t ** iteration_isets;

So in realloc statt mit:

iteration_isets = realloc(iteration_isets, sizeof(itemsetList_t *) * max_elem);

Ich habe:

iteration_isets = realloc(iteration_isets, sizeof(int) * max_elem);

Und das verursachte meinen Haufen Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top