Application Verifier in Kombination mit Debugging Tools für Windows ist ein erstaunliches Setup. Sie können beides als Teil des Windows-Treiberkits oder des leichteren Windows SDK erhalten . ( Ich habe bei der Untersuchung einer früheren Frage zu einem Problem mit der Heap-Beschädigung von Application Verifier erfahren.) Ich habe in der Vergangenheit auch BoundsChecker und Insure ++ (in anderen Antworten erwähnt) verwendet, obwohl ich überrascht war, wie viel Funktionalität in Application Verifier vorhanden war.
Electric Fence (auch bekannt als "efence"), dmalloc , valgrind usw. sind alle erwähnenswert, aber die meisten davon sind unter * nix viel einfacher zum Laufen zu bringen als unter Windows. Valgrind ist lächerlich flexibel: Ich habe große Serversoftware mit vielen Heap-Problemen getestet.
Wenn alles andere fehlschlägt, können Sie Ihrem eigenen globalen Operator neue / delete- und malloc / calloc / realloc-Überladungen bereitstellen. Die Vorgehensweise hängt vom Compiler und der Plattform ab. Dies ist eine Investition. aber es kann sich auf lange Sicht auszahlen. Die Liste der wünschenswerten Funktionen sollte aus dmalloc und electricfence und dem überraschend hervorragenden Buch Writing Solid Code bekannt sein :
- Wachposten : Lassen Sie vor und nach jeder Zuweisung etwas mehr Platz, um die maximale Ausrichtungsanforderung zu berücksichtigen. Füllen Sie mit magischen Zahlen (hilft dabei, Pufferüber- und -unterläufe und gelegentliche "wilde" Zeiger abzufangen)
- Alloc Fill : Füllen Sie neue Allokationen mit einem magischen Wert ungleich 0 - Visual C ++ erledigt dies bereits in Debug-Builds für Sie (hilft bei der Verwendung nicht initialisierter Vars).
- free fill : Füllen Sie den freigegebenen Speicher mit einem magischen Wert ungleich 0 aus, der einen Segfault auslöst, wenn er in den meisten Fällen dereferenziert wird (hilft beim Auffangen baumelnder Zeiger).
- verzögert frei : Geben Sie den freigegebenen Speicher für eine Weile nicht auf den Heap zurück, halten Sie ihn frei gefüllt, aber nicht verfügbar (hilft dabei, mehr baumelnde Zeiger abzufangen, fängt nahegelegene doppelte Freigaben ab).
- Tracking : Manchmal kann es nützlich sein, aufzuzeichnen, wo eine Zuordnung vorgenommen wurde
Beachten Sie, dass wir in unserem lokalen Homebrew-System (für ein eingebettetes Ziel) das Tracking von den meisten anderen Dingen getrennt halten, da der Laufzeitaufwand viel höher ist.
Wenn Sie an weiteren Gründen für die Überladung dieser Zuordnungsfunktionen / Operatoren interessiert sind, lesen Sie meine Antwort auf " Gibt es einen Grund, den globalen Operator neu zu überladen und zu löschen?" ;; Abgesehen von der schamlosen Eigenwerbung werden andere Techniken aufgelistet, die bei der Verfolgung von Heap-Korruptionsfehlern hilfreich sind, sowie andere anwendbare Tools.
Da ich hier bei der Suche nach zugewiesenen / freien / Zaunwerten, die MS verwendet, immer wieder meine eigene Antwort finde, finden Sie hier eine weitere Antwort, die Microsoft-Dbgheap-Füllwerte abdeckt .