GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso diagnosticare errori di danneggiamento dell'heap su Windows?

La soluzione di @Carlos è perfetta per problemi minori. Ma per problemi enormi, il rallentamento risultante a volte è qualcosa che non puoi sopportare.

In questo caso, si può posizionare

ASSERT(_CrtCheckMemory()); 

da qualche parte nel codice, dove si sospetta che il problema sia già presente. Questo comando controlla l'heap nel (e solo nel) punto in cui è inserito, e non dopo ogni new o delete chiamata come nel caso di _CRTDBG_CHECK_ALWAYS_DF . Ciò mantiene il tempo di esecuzione ragionevole, rispetto all'opzione _CRTDBG_CHECK_ALWAYS_DF .

Si può trovare la riga di codice problematica piuttosto rapidamente utilizzando un tipo di approccio di ricerca binaria per posizionare gli assert.

Tuttavia, a volte _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF) e/o _CrtCheckMemory() non sono in grado di rilevare i problemi. Poi usando gflags è un'altra possibilità, che è in grado di mostrare dove avviene la corruzione del mucchio. In poche parole:

  • abilita l'heap della pagina (di solito avresti bisogno dei privilegi dell'amministratore ), ad esempio:
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /enable <full_path_to_exe_to_debug.exe> /full 
    
    ci sarà un rapporto, quell'heap controlla exe_to_debug.exe sono stati attivati.
  • esegui il programma nel debugger. Gli accessi fuori dai limiti, che danneggerebbero l'heap, porterebbero ora alla violazione dell'accesso e sono facilmente visibili nel debugger.
  • disabilita l'heap della pagina una volta terminato il debug, ad esempio:
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
    
  • i programmi con controllo heap attivato possono essere elencati tramite
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
    

Usa l'heap di debug e chiamalo all'inizio in main().

_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);

Rallenterà molto il programma ma dovrebbe interrompersi non appena si verifica il danneggiamento.

Fare riferimento a questo articolo per i dettagli:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks


Linux
  1. Come installare Vim (vi) su Windows 10

  2. Linux:come disinstallare Grub?

  3. Come eseguire chkdsk in Windows

  4. Come convertire un file eseguibile Linux (binario) in un file exe di Windows?

  5. Come posso eseguire un eseguibile Windows da WSL (Ubuntu) Bash

Come eseguire Podman su Windows

Come convertire un file Windows in un file UNIX

Come risolvere gli aggiornamenti di Windows bloccati allo 0%

Come installare Hyper-V su Windows 10 21H

Come ripristinare un aggiornamento di Windows

Come installare Wine su Ubuntu?