Déboguer les corruptions de mémoire à l'aide d'Address Sanitizer

Ce document explique comment activer des outils de débogage spéciaux lorsque vous utilisez AGDE. Ces outils contribuent à diagnostiquer les corruptions de mémoire et à écraser les erreurs.

HWAddress Sanitizer et Address Sanitizer

HWAddress Sanitizer (HWASan) et Address Sanitizer (ASan) sont des outils de débogage des corruptions de mémoire. Ils permettent de déboguer ce type de problème et d'écraser les erreurs telles que les suivantes :

  • Débordement positif ou négatif de la mémoire tampon allouée par la pile
  • Débordement positif ou négatif du tampon de tas de mémoire
  • Utilisation de la pile en dehors de son champ d'application
  • Erreurs d'appels multiples ou aléatoires de "free"
  • Utilisation de la pile après le retour (HWASan uniquement)

Nous vous recommandons de n'activer HWASan ou ASan que lorsque vous déboguez un problème ou dans le cadre de tests automatisés. Même si ces outils sont performants, leur utilisation peut donner lieu à une pénalité.

Comportement lors de l'exécution

Lorsqu'ils sont activés, HWASan et ASan vérifient automatiquement qu'il n'y a pas de corruption de mémoire pour l'ensemble de l'environnement d'exécution de votre application.

Si un problème de mémoire est détecté, l'application plante avec l'erreur SIGBART (abandon du signal) et affiche un message détaillé dans logcat. Une copie de ce message est également écrite dans un fichier sous /data/tombstones.

Le message d'erreur ressemble à ceci :

ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
    #0 0x7b24d90a08  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
    #1 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)
    #2 0x7b8f1db364  (/apex/com.android.art/lib64/libart.so+0x18f364)
    #3 0x7b8f2ad8d4  (/apex/com.android.art/lib64/libart.so+0x2618d4)

0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
    #0 0x7b92a322bc  (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
    #1 0x7b24d909e0  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
    #2 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)

Conditions préalables

Installer un build HWASan de l'OS Android

Pour utiliser HWASan, suivez les instructions de configuration de la documentation HWASan afin d'installer un build HWASan de l'OS Android pour les appareils Google Pixel.

Pour les autres appareils, contactez votre fabricant pour obtenir un build HWASan de l'OS, le cas échéant, ou utilisez l'outil logiciel ASan.

Utiliser la bibliothèque standard C++ partagée dans votre projet

En raison d'un problème connu, ASan n'est pas compatible avec la gestion des exceptions C++ lorsque vous utilisez libc++_static. Ce problème ne survient pas lorsque vous utilisez libc++_shared.

HWASan dispose de sa propre implémentation des opérateurs new et delete, qui ne peuvent pas être utilisés si la bibliothèque standard est associée de manière statique au projet.

Pour modifier ce paramètre, consultez la section Associer la bibliothèque standard C++ de ce document.

Activer la génération du pointeur de frame

HWASan et ASan utilisent un dérouleur "rapide" basé sur un pointeur de frame pour générer des informations de trace de la pile pour les événements d'allocation et de désallocation de mémoire. Par conséquent, vous devez activer la génération du pointeur de frame dans les paramètres de compilation C++ pour pouvoir utiliser ces fonctionnalités. Autrement dit, vous devez désactiver l'optimisation de l'omission du pointeur de frame.

Pour modifier ce paramètre, consultez la section Comment activer la génération du pointeur de frame de ce document.

Configurer votre projet Visual Studio pour utiliser HWASan ou ASan

Activer HWASan ou ASan

Pour activer HWASan ou ASan, accédez à Configuration Properties > General (Propriétés de la configuration > Général) dans les pages de propriétés du projet.

Menu des propriétés de l'explorateur de solution Visual Studio pour le projet en cours

Figure 1 : Option Properties (Propriétés) du projet dans la fenêtre de l'Explorateur de solutions de Visual Studio

Boîte de dialogue "Properties" (Propriétés) du projet, avec les propriétés générales affichées et les paramètres "Sanitizer" en surbrillance

Figure 2 : Paramètre Address Sanitizer (ASan) dans les propriétés générales du projet

Pour activer HWASan pour votre projet, définissez le paramètre Address Sanitizer (ASan) sur Hardware ASan Enabled (fsanitize=hwaddress) (Matériel ASan activé (fsanitize=hwaddress)).

Pour activer ASan pour votre projet, définissez le paramètre Address Sanitizer (ASan) sur ASan Enabled (fsanitize=address) (ASan activé (fsanitize=address)).

Comment activer la génération du pointeur de frame

La génération du pointeur de frame est contrôlée par le paramètre du compilateur C/C++ Omit Frame Pointer (Omettre le pointeur de frame). Elle se trouve dans la section Property Pages (Pages de propriétés) de votre projet, sous Configuration Properties > C/C++ > Optimization (Propriétés de configuration > C/C++ > Optimisation).

Boîte de dialogue "Property Pages" (Pages de propriétés) du projet avec les propriétés d'optimisation C/C++ affichées et les paramètres d'omission du pointeur de frame en surbrillance

Figure 3 : Emplacement du paramètre Omit Frame Pointer (Omettre le pointeur de frame)

Lorsque vous utilisez HWASan ou ASan, définissez le paramètre Omit Frame Pointer (Omettre le pointeur de frame) sur No (-fno-omit-frame-pointer) (Non (-fno-omit-frame-pointer)).

Associer la bibliothèque standard C++ en mode bibliothèque partagée

Le paramètre du mode d'association de la bibliothèque standard C++ est disponible dans la section Property Pages (Pages de propriétés) de votre projet, sous Configuration Properties > General (Propriétés de la configuration > Général), dans les paramètres par défaut du projet.

Boîte de dialogue "Property Pages" (Pages de propriétés) du projet avec la catégorie "General" (Général) sélectionnée et le paramètre "Use of STL" (Utilisation de STL) en surbrillance

Figure 4 : Emplacement du paramètre du mode d'association pour la bibliothèque standard C++

Lorsque vous utilisez HWASan ou ASan, définissez Use of STL (Utilisation de STL) sur Use C++ Standard Libraries (.so) (Utiliser des bibliothèques standards C++ (.so)). Cette valeur associe la bibliothèque standard C++ à votre projet en tant que bibliothèque partagée, ce qui est nécessaire au bon fonctionnement de HWASan et d'ASan.

Créer une configuration de compilation pour utiliser Address Sanitizer

Si vous préférez utiliser HWASan ou ASan de manière temporaire, vous pouvez choisir de ne pas créer de configuration de compilation réservée à leur utilisation. Cela peut être le cas si votre projet est de petite envergure, si vous souhaitez juste explorer cette fonctionnalité ou si vous avez à traiter un problème détecté lors des tests.

Toutefois, si vous jugez que cela peut être utile et si vous prévoyez de vous en servir régulièrement, vous pouvez créer une configuration de compilation pour HWASan ou ASan, comme indiqué dans l'exemple Teapot. Cette approche est, par exemple, conseillée si vous exécutez régulièrement Address Sanitizer lors de vos tests unitaires ou pendant les tests de détection de fumée de votre jeu.

La création d'une configuration de compilation distincte peut s'avérer particulièrement utile si vous disposez d'un projet volumineux avec un grand nombre de bibliothèques tierces différentes, que vous associez habituellement de manière statique à la bibliothèque standard C++. Les configurations de compilation dédiées permettent de garantir que les paramètres de votre projet restent exacts à tout moment.

Pour créer une configuration de compilation, dans la section Property Pages (Pages de propriétés) de votre projet, cliquez sur le bouton Configuration Manager (Gestionnaire de configuration), puis ouvrez le menu déroulant Active solution configuration (Active solution configuration). Sélectionnez ensuite , puis créez une configuration de compilation avec un nom approprié (par exemple, HWASan activé).