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 :
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).
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.
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.
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.
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.