GNU/Linux >> Tutoriels Linux >  >> Linux

Comment diagnostiquer les erreurs de corruption de tas sous Windows ?

La solution de @Carlos est parfaite pour les petits problèmes. Mais pour les gros problèmes, le ralentissement qui en résulte est parfois insupportable.

Dans ce cas, on peut placer

ASSERT(_CrtCheckMemory()); 

quelque part dans le code, où l'on soupçonne que le problème est déjà présent. Cette commande vérifie le tas à (et seulement à) l'endroit où il est inséré, et non après chaque new ou delete appeler comme dans le cas de _CRTDBG_CHECK_ALWAYS_DF . Cela maintient le temps d'exécution raisonnable, par rapport à l'option _CRTDBG_CHECK_ALWAYS_DF .

On peut trouver assez rapidement la ligne de code problématique en utilisant une approche de type recherche binaire pour placer les assertions.

Cependant, parfois _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF) et/ou _CrtCheckMemory() ne sont pas en mesure de détecter les problèmes. Puis en utilisant gflags est une autre possibilité, qui est capable de montrer où la corruption de tas se produit. En un mot :

  • activer le segment de page (généralement, vous auriez besoin des privilèges d'administrateur ), par exemple :
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /enable <full_path_to_exe_to_debug.exe> /full 
    
    il y aura un rapport, ce tas vérifie exe_to_debug.exe ont été activés.
  • exécuter le programme dans le débogueur. Les accès hors limites, qui corrompraient le tas, conduisent maintenant à une violation d'accès et sont facilement visibles dans le débogueur.
  • désactiver le segment de page une fois le débogage terminé, par exemple :
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
    
  • les programmes avec vérification de tas activée peuvent être listés via
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
    

Utilisez le tas de débogage et appelez-le au tout début dans main().

_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);

Cela ralentira beaucoup le programme, mais il devrait s'arrêter dès que la corruption se produira.

Reportez-vous à cet article pour plus de détails :https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks


Linux
  1. Linux – Comment désinstaller Grub ?

  2. Comment exécuter chkdsk sous Windows

  3. Comment convertir un fichier exécutable Linux (binaire) en fichier exe Windows ?

  4. Comment installer InfluxDB sous Windows

  5. Comment puis-je exécuter un exécutable Windows à partir de WSL (Ubuntu) Bash

Comment exécuter Podman sous Windows

Comment convertir un fichier Windows en un fichier UNIX

Comment réparer les mises à jour Windows bloquées à 0 %

Comment installer Hyper-V sur Windows 10 21H

Comment annuler une mise à jour Windows

Comment installer Wine sur Ubuntu ?