Frage

Wir haben eine Speicherüberschreibung Problem. Irgendwann im Laufe unseres Programms, ein Speicherplatz wird überschrieben und verursacht unser Programm zum Absturz bringen. das Problem tritt nur im Release-Modus. wenn in Debug, ist alles gut. das ist ein klassischer C / C ++ Fehler und ein sehr schwer, einer zu suchen.

Ich fragte mich, ob es einen Weg gibt einige ‚Debugging-Code‘ hinzufügen, die diesen Speicherplatz beobachten und wird einen Rückruf einmal seine geändert nennen. Dies ist im Grunde, was ein Debugger in Debug-Modus (a ‚Datenhaltepunkt‘) tun könnte, aber wir brauchen etwas ähnliches in Release.

War es hilfreich?

Lösung

Wenn Sie den Speicherort der Variablen kontrollieren können, dann können Sie es auf einer speziellen Seite zuweisen und die Berechtigungen für die Seite festgelegt nur zu erlauben, liest mit Virtual (unter Windows ... nicht sicher für Linux).

Auf diese Weise kann eine Zugriffsverletzung erhalten, wenn jemand es zu schreiben versucht. Mit einer Ausnahme Übersetzungsfunktion können Sie diese als Callback behandeln.

Auch wenn Sie die Variable nicht direkt (z. B. es ist ein Klasse-Mitglied) bewegen kann, vielleicht könnten Sie eine ausreichende Polsterung hinzufügen um die Variable, um sicherzustellen, auf einer eigenen Seite und den gleichen Ansatz verwenden.

Andere Tipps

Sie können immer noch Debug-Symbole für eine „Freigabe“ Stück Code generieren. Dies kann nach wie vor nur durch einen Debugger ausgeführt werden, wie Sie es in „Debug“ -Modus.

Ich habe vor kurzem etwas ähnlich mit einem unserer Release-Treiber, so dass wir es durch VTune laufen konnte. Für die Microsfot LINK, fügte ich die -DEBUG Flagge, für Microsoft CC I -Zi hinzugefügt. Alles funktioniert gut. MSKB Link

Sie können diese Link rel="nofollow nützlich.

vorausgesetzt, Sie mit Windows windbg verwendet Ihr Programm zu debuggen und die ba Check-out-Befehl diese brechen werden, wenn der Speicher zugegriffen wird.

Es gibt Werkzeuge für diese - wie Heap-Agent und Bounds und viele andere, die Überschreibungen entdecken. Grundsätzlich müssen Sie einige sentinels am Ende Ihrer Speicherzuordnungen und sie müssen überprüft werden.

Debugging-APIs sind plattformspezifisch, aber sie existieren. Windows- und UNIX APIs können online eingesehen werden.

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