Erreurs de segment de mémoire

Des erreurs de segment de mémoire peuvent se produire lorsque votre code écrase accidentellement les informations de contrôle utilisées par les fonctions de gestion de la mémoire pour contrôler l'utilisation des segments de mémoire. L'application en cours de débogage doit avoir été créée avec la fonction de contrôle des segments de mémoire.

Chaque bloc d'espace mémoire attribué au sein d'un segment de mémoire contient une zone de données (qui commence à l'adresse renvoyée par la fonction d'attribution) ainsi qu'une zone de contrôle adjacente à la zone de données et nécessaire aux fonctions de gestion de la mémoire pour libérer efficacement l'espace mémoire. Si vous écrasez une structure de contrôle dans un segment de mémoire (par exemple, en écrivant des éléments en dehors des limites attribuées d'un tableau ou en copiant une chaîne dans un bloc d'espace mémoire attribué trop petit), les informations de contrôle sont corrompues et peuvent engendrer un comportement incorrect du programme, même si les zones de données des autres blocs attribués ne sont pas écrasées.

Pour localiser les erreurs de segment de mémoire, tenez compte des points suivants :

Recherche d'erreurs de segment de mémoire en dehors du débogueur

Pour détecter les erreurs de segment de mémoire, vous pouvez compiler votre programme afin d'utiliser les versions de contrôle des segments de mémoire des fonctions de gestion de la mémoire. Pour plus d'informations sur l'option de compilation -qheapdebug, consultez la rubrique sur l'option de compilation de débogage connexe. Lorsque vous exécutez un programme compilé avec cette option, un contrôle des segments de mémoire est réalisé sur le segment de mémoire par défaut chaque fois qu'une fonction de gestion de la mémoire est appelée. Ce contrôle consiste à vérifier les structures de contrôle de chaque bloc d'espace mémoire attribué au sein d'un segment de mémoire et à s'assurer qu'aucune d'entre elles n'a été écrasée. Si une erreur est détectée, le programme s'interrompt et des informations concernant l'erreur sont consignées (notamment l'adresse du segment de mémoire corrompu, le fichier source et le numéro de ligne où le dernier état correct de segment de mémoire a été détecté, et le fichier source et le numéro de ligne où l'erreur de mémoire a été détectée).

Vérification des segments de mémoire par défaut et des autres segments de mémoire

La vérification de segment de mémoire est uniquement activée pour le segment de mémoire utilisé par défaut par chaque exécutable. Si les versions de débogage des fonctions de gestion de la mémoire ne signalent aucune corruption de segment de mémoire et que vous suspectez toujours un problème, d'autres segments de mémoire sont peut-être utilisés et corrompus.

Indication des erreurs de segment de mémoire dans le débogueur

Vous pouvez indiquer la cause d'une erreur de segment de mémoire dans le débogueur, à condition que le segment de mémoire à l'origine de l'erreur soit le segment de mémoire par défaut. Pour ce faire, rétrécissez systématiquement l'espace entre la dernière ligne correcte du segment de mémoire et la première ligne corrompue. Utilisez les commandes d'exécution et d'avance pas à pas, les points d'arrêt sur ligne et sur fonction, ainsi que la fonction Effectuer un contrôle de segment de mémoire à l'arrêt pour cibler votre recherche. Pour plus d'informations, consultez la rubrique connexe.

Fonction Effectuer un contrôle de segment de mémoire à l'arrêt et détection d'autres erreurs de code

Si votre programme comporte des erreurs sémantiques, la fonction Effectuer un contrôle de segment de mémoire à l'arrêt peut s'avérer abusive : elle peut engendrer des résultats différents là où le programme n'accède pas correctement aux données de la pile. En effet, à cause de cette fonction, le processus et l'unité d'exécution en cours de débogage appellent la fonction de contrôle des segments de mémoire à chaque interruption de l'exécution. Cette fonction corrompt la zone protégée de la pile en remplaçant une partie de cette zone par le cadre de pile. Par exemple, si une fonction appelée renvoie l'adresse d'une variable locale, le contenu de cette dernière est accessible à partir de la fonction d'appel et ne change pas tant que le cadre de pile utilisé par la fonction appelée n'est pas écrasé par un appel ultérieur. Cependant, si vous lancez une avance d'un pas avec retour à partir de la fonction appelée alors que la fonction Effectuer un contrôle de segment de mémoire à l'arrêt est activée, la fonction de contrôle des segments de mémoire est appelée dès le retour de la fonction appelée et l'espace mémoire désigné par le pointeur en retour risque d'être écrasé par le cadre de pile de la fonction de contrôle.

Fonction Effectuer un contrôle de segment de mémoire à l'arrêt et performances

Le contrôle des segments de mémoire dans le débogueur est très exigeant pour les commandes d'avance pas à pas car le segment est contrôlé après chaque pas. Si vous analysez pas à pas de grandes portions de code ou que les points d'arrêt sont nombreux, le débogage peut être très lent. Dans ce cas, essayez de n'activer la fonction Effectuer un contrôle de segment de mémoire à l'arrêt que dans les zones que vous soupçonnez d'être à l'origine d'erreurs.

Remarque :
  • Pour que la fonction Effectuer un contrôle de segment de mémoire à l'arrêt soit efficace, vous devez compiler votre application afin d'utiliser les versions de contrôle des segments de mémoire des fonctions de gestion de la mémoire. Pour plus d'informations, consultez la documentation du compilateur.
  • Si vous activez la fonction Effectuer un contrôle de segment de mémoire à l'arrêt, que vous exécutez votre application entièrement et qu'elle contient une erreur de segment de mémoire, le contrôle des segments de mémoire n'est pas réalisé. Pour contrôler le segment de mémoire avant la fin de l'exécution, définissez un point d'arrêt sur la dernière ligne de votre application.
  • Si vous déboguez une application comportant plusieurs unités d'exécution et qu'une de ces unités s'interrompt pendant l'exécution dans le code de gestion de la mémoire du compilateur contenant un sémaphore, le contrôle des segments de mémoire n'est pas réalisé.

Commentaires en retour