GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie diagnostiziere ich Heap-Korruptionsfehler unter Windows?

Die Lösung von @Carlos ist perfekt für kleinere Probleme. Aber bei großen Problemen ist die resultierende Verlangsamung manchmal etwas, das Sie nicht ertragen können.

In diesem Fall kann man

platzieren
ASSERT(_CrtCheckMemory()); 

irgendwo im Code, wo man das Problem bereits vermutet. Dieser Befehl überprüft den Heap an (und nur an) der Stelle, an der er eingefügt wird, und nicht nach jedem new oder delete Aufruf wie im Fall von _CRTDBG_CHECK_ALWAYS_DF . Dies hält die Ausführungszeit im Vergleich zu Option _CRTDBG_CHECK_ALWAYS_DF angemessen .

Man kann die problematische Codezeile ziemlich schnell finden, indem man eine Art binäre Suche zum Platzieren der Behauptungen verwendet.

Manchmal jedoch _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF) und/oder _CrtCheckMemory() sind nicht in der Lage, Probleme zu erkennen. Dann mit gflags ist eine weitere Möglichkeit, die zeigen kann, wo die Heap-Korruption passiert. Kurz gesagt:

  • Seitenheap aktivieren (normalerweise benötigen Sie Admin-Privilegien ), z. B.:
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /enable <full_path_to_exe_to_debug.exe> /full 
    
    es wird einen Bericht geben, dass der Heap nach exe_to_debug.exe sucht aktiviert wurden.
  • Programm im Debugger ausführen. Zugriffe außerhalb der Grenzen, die den Heap beschädigen würden, führen nun zu einer Zugriffsverletzung und sind im Debugger leicht zu erkennen.
  • Seitenheap deaktivieren, sobald das Debuggen abgeschlossen ist, z. B.:
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
    
  • Programme mit aktiviertem Heap-Check können über
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
    
    aufgelistet werden

Verwenden Sie den Debug-Heap und rufen Sie diesen ganz am Anfang in main() auf.

_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);

Es wird das Programm stark verlangsamen, aber es sollte brechen, sobald eine Beschädigung auftritt.

Einzelheiten finden Sie in diesem Artikel:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks


Linux
  1. So installieren Sie Vim (vi) unter Windows 10

  2. Linux – Wie deinstalliere ich Grub?

  3. So führen Sie chkdsk unter Windows aus

  4. Wie konvertiert man eine ausführbare Linux-Datei (binär) in eine Windows-Exe-Datei?

  5. Wie kann ich eine ausführbare Windows-Datei von WSL (Ubuntu) Bash ausführen

So führen Sie Podman unter Windows aus

So konvertieren Sie eine Windows-Datei in eine UNIX-Datei

So beheben Sie Windows-Updates, die bei 0 % hängen bleiben

So installieren Sie Hyper-V unter Windows 10 21H

So setzen Sie ein Windows-Update zurück

Wie installiere ich Wine auf Ubuntu?