DetailPage-MSS-KB

Base de connaissances

Numéro d'article: 286470 - Dernière mise à jour: dimanche 10 mars 2013 - Version: 8.0

 

Sommaire

Résumé

Cet article explique comment utiliser l'outil de tas de Page (Pageheap.exe) dans Microsoft Windows XP, Microsoft Windows 2000 et Microsoft Windows Server 2003.

Plus d'informations

PageHeap.exe définit les indicateurs de tas de page qui aident à trouver corruption au tas. Il peut également aider à détecter les fuites dans les programmes qui sont s'exécutant sur Windows 2000 Professionnel Service Pack 2 (SP2) et Windows XP Systèmes professionnels.

PageHeap.exe présente un contrôle de logiciel couche (Gestionnaire de segments de Page) entre l'application et le système vérifie toutes les opérations de mémoire dynamique (allocations, libère et d'autres opérations de tas). Lorsque le Gestionnaire de segments de Page est activé, l'application est en cours de test est alors démarrage sous un débogueur. Si un problème est détecté, il provoque un débogueur saut.

Important : PageHeap.exe ne précise pas quel est le bogue, mais il se bloquera le système lorsqu'un problème est rencontré. Il permet une vérification de la couche qui existe déjà dans les bibliothèques système de Ntdll.dll dans Windows 2000 Professionnel Service Pack 2 et Windows XP Professionnel. PageHeap.exe ne fonctionne pas sur la précédente versions de Microsoft Windows.

Si l'application en cours de test n'est pas démarrage sous un débogueur et un bogue est rencontré, il se bloquera simplement sans vos commentaires.

Concepts

Un problème courant dans le développement d'applications est une altération de tas. Cela se produit généralement lorsqu'une application alloue un bloc de mémoire de tas d'un compte tenu de la taille et puis écrit aux adresses de mémoire au-delà de la taille demandée de la bloc de tas. Une altération de tas peut également se produire lorsqu'une application écrit à bloquer de mémoire a déjà été libérée.

Deux concepts sont essentiels à comprendre les commandes relatives à la Pageheap.exe et la façon de l'utiliser :
  • Des altérations dans les blocs de tas sont découverts par une mise une page non accessible à la fin de l'allocation ou en vérifiant le remplissage modèles lorsque le bloc est libéré.
  • Il existe deux tas (pleine page tas et tas de page normal) pour chaque segment de mémoire créé dans un processus qu'a page heap activé.
    • Segment de mémoire pleine page révèle des altérations dans les blocs du tas en plaçant non accessibles page à la fin de l'allocation. L'avantage de cette approche est que vous atteindre « mort subite, « ce qui signifie que le processus va accéder violent (AV) exactement au point de défaillance. Ce comportement, échecs facile à déboguer. L'inconvénient est que chaque allocation utilise au moins une page de validation mémoire. Pour un processus gourmand en mémoire, les ressources système peuvent être rapidement épuisé.
    • Tas de page normal peut être utilisé dans les situations où les limitations de mémoire de rendu segment de mémoire pleine page inutilisable. Il vérifie les motifs de remplissage lorsqu'un bloc de segment de mémoire est libéré. L'avantage de cette méthode est qu'elle réduit considérablement la consommation de mémoire. L'inconvénient est que les altérations uniquement être détectées que lorsque le bloc est libérées. Échecs est ainsi plus difficile à déboguer.

Emplacement de téléchargement pour l'outil de Pageheap

Pour télécharger le dernier package d'outils de débogage, cliquez sur les éléments suivants lien :
http://www.Microsoft.com/whdc/devtools/debugging/default.mspx (http://www.microsoft.com/whdc/devtools/debugging/default.mspx)


Sélectionnez la dernière version des outils de débogage. Lorsque vous installez les outils, sélectionnez la Personnalisé installation et puis installer dans un répertoire avec un nom approprié. Par exemple, installer outils pour C:\Debug ou C:\Debugtools.

Choix d'une méthode pour étudier les altérations de bloc du tas

La plupart de la corruption dans des blocs de tas peut être découverts dans un de deux façons différentes :
  • Segment de mémoire pleine page : placez une page non accessible à la fin de l'allocation.
  • Tas de page normal : lorsque le bloc Obtient des modèles de remplissage à cocher libérées.

Segment de mémoire pleine page

Segment de mémoire pleine page doit être activé pour des processus individuels, ou sous l'onglet Paramètres limités pour les processus de grande taille, en raison de sa mémoire haute configuration requise. Il ne peut pas activé au niveau du système, car il est difficile de évaluer la taille du fichier page requise. À l'aide d'un fichier d'échange est trop petit avec au niveau du système de segment de mémoire pleine page restitue le système non amorçable.

Le avantage du segment de mémoire pleine page est qu'il entraîne un processus de violation d'accès (AV) exactement au point de défaillance. Ainsi, l'échec facile à déboguer. Dans l'ordre pour être en mesure d'identifier les défaillances, utilisez d'abord du tas de page normal pour déterminer le plage où un processus échoue et puis utiliser un segment de mémoire pleine page sur la personne processus à grande échelle pour qui restreint classe d'allocations (autrement dit, un plage de taille spécifique ou une bibliothèque spécifique).

Tas de Page normal

Tas de page normal peut être utilisé pour les essais de grande envergure processus sans la forte consommation de mémoire requiert de ce segment de mémoire pleine page. Toutefois, des tas de page normal retarde la détection jusqu'à ce que les blocs sont libérées, ce qui rend échecs plus difficiles à déboguer.

En règle générale, utilisez des tas de page normal pour les processus à grande échelle initiales de test. Ainsi, si des problèmes sont détectés, Activer le segment de mémoire pleine page pour une classe restreinte d'allocations dans les processus.

Tas de page normal peut être activé en toute sécurité au niveau du système pour toutes les processus. C'est très utile sur les bancs de test qui exécutent le système général validation, plutôt que de composant a concentré ses essais. Tas de page normal peut également être activé pour un processus unique.

À l'aide de GFlags avec segment mémoire de Page à l'échelle du système

L'outil GFlags est utilisée pour activer le tas de page à l'échelle du système. Dans l'ordre pour un Commande GFlags prenne effet, vous devez redémarrer votre ordinateur après avoir émis la commande.

Pour activer le tas de page normal au niveau du système :
  1. Tapez le texte suivant à la ligne de commande:r - gflags + hpa

  2. Redémarrez votre ordinateur.
Pour désactiver le tas de page normal au niveau du système :
  1. Tapez le texte suivant à la ligne de commande :gflags - r-hpa

  2. Redémarrez votre ordinateur.
Remarque Aucun autre paramètre GFlags n'est utiles lorsque vous activez le tas de page. Si d'autres paramètres qui semble être lié au tas sont activées, puis la page bogues de tas peuvent être introduites en raison de conflits entre le Gestionnaire de segments de page et Ces indicateurs de tas « inoffensifs ».

À l'aide de GFlags avec un tas de Page d'un processus unique

Vous pouvez activer le tas de page contrôler un processus spécifique. À faire cela, procédez comme suit :
  1. À l'invite de commandes, modifiez le répertoire où vous avez installé le débogage outils.
  2. À l'invite de commandes, tapez la commande suivante et appuyez sur ENTREZ :
    Gflags.exe /p /enableLsass.exe
    RemarqueLsass.exe représente le nom du processus que vous avez vous voulez surveiller avec l'outil de Pageheap.
  3. Lorsque vous n'avez plus besoin du tas de page de surveillance, désactiver la surveillance. Pour ce faire, tapez la commande suivante à une invite de commande et appuyez sur ENTREZ :
    Gflags.exe /p /disable Lsass.exe
    RemarqueLsass.exe représente le nom du processus que vous avez vous voulez surveiller avec l'outil de Pageheap.
  4. Pour répertorier tous les programmes qui disposent actuellement de Pageheap Vérification activée, tapez la commande suivante à une invite de commandes, puis Appuyez sur ENTRÉE:
    Gflags.exe /p

Allocations non alignées

Les gestionnaires de tas Windows (toutes versions) ont toujours garantie. que les allocations de tas ont une adresse de démarrage est de 8 octets aligné (sur les plates-formes 64 bits l'alignement est 16 octets). Le Gestionnaire de tas page rend le même garantie. Cela est impossible, toutefois, si vous souhaitez que le fin-de-l'allocation exactement à la fin d'une page. La fin de page exacte allocation est nécessaire pour qu'une erreur off-en-un octet déclenchera une lecture ou écrire dans la page non accessible et provoquer une défaillance immédiate.

If la taille demandée par l'utilisateur pour le bloc n'est pas 8 octets alignés, puis les tas de page ne répond pas à « adresse 8 octets aligné start » et la page d'adresse de fin » contraintes alignés ». La solution consiste à répondre à la première contrainte et de rendre le début du bloc 8 octets est aligné. Puis utiliser un motif de remplissage petite entre le fin de bloc et le début de la page non accessible. Ce motif de remplissage Il est possible à partir de 0 octets à 7 octets de longueur sur les architectures 32 bits. Le remplissage motif est vérifiée lors de la libre.

Si la détection de défaillance immédiate est nécessaire pour ces allocations qui sinon comporte un motif de remplissage à la fin, le Gestionnaire de tas page ignorer la règle d'alignement de 8 octets et toujours aligner la fin de l'allocation à une limite de page en utilisant les paramètres non alignées et toutes les . Pour plus d'informations, consultez le paramètre / non alignés .

Remarque: certains programmes font des hypothèses sur l'alignement de 8 octets et ils cesser de fonctionner correctement avec le paramètre / non alignés . Microsoft Internet Explorer est un tel programme.

Pages non validées pour les Allocations de segment de mémoire pleine page

L'implémentation du segment de mémoire pleine page principale valide deux pages pour tout allocation inférieure à une seule page. Une page est utilisée pour la répartition de l'utilisateur, et l'autre est rendue non accessible à la fin de la mémoire tampon.

Saturations de tampon de fin peuvent être détectées à l'aide d'une zone réservés virtuelle espace, au lieu d'une page validée non accessible. Une violation d'accès exception se produit lorsque le processus de touche qu'un espace virtuel réservé. Cela approche peut réduire la consommation de mémoire jusqu'à 50 %. Pour plus d'informations informations, consultez le paramètre / dégage .

Injection d'erreurs

Vous pouvez contrôler le Gestionnaire de segments de page afin que certaines allocations sont délibérément a échoué. Ceci est utile pour simuler des conditions de mémoire faible sans en fait à l'aide de toutes les ressources système.

Spécifiez un nombre compris entre 1 et 10 000 pour représenter la probabilité qu'une allocation échoue. En utilisant un probabilité de 10 000 garantit que 100 % des allocations échouera. A probabilité de 2 000 indique qu'environ 20 % d'allocations échouera.

Le Gestionnaire de tas page prend soin d'éviter les pannes injection dans les deux premières 5 secondes de la durée de vie du processus et le Windows NT chemins de code de chargeur (pour exampole, LoadLibrary, FreeLibrary). Si 5 secondes n'est pas suffisante pour permettre à votre processus de démarrage terminée, vous pouvez ensuite spécifier une délai d'attente plu au début du processus. Pour plus d'informations, consultez le paramètre /fault .

Lorsque vous utilisez le paramètre /fault et le processus en cours de test comporte un bogue, une exception est déclenché. En règle générale, la raison en est que l'opération d'allocation a retourné une valeur NULL, et ultérieurement l'application tente d'accéder l'attribué mémoire. Étant donné que l'allocation a échoué, toutefois, la mémoire n'est pas accessible, et par conséquent, une violation d'accès se produit.

L'autre raison pour laquelle une exception est déclenchée est que l'application essaie de faire face à l'allocation Échec, mais ne libère ne pas de certaines ressources. Ce manifeste comme une fuite de mémoire et est plus difficile à déboguer.

Pour vous aider à diagnostiquer ces échecs, le Gestionnaire de segments de page conserve un historique des traces de pile à partir du moment d'injection d'erreurs. Ces traces peuvent être affichés avec le débogueur suivant commande :

! tas -p -f [nombre de TRACES]

Par défaut, l'extension affiche uniquement la dernière quatre traces.

Attachement d'un débogueur automatiquement au démarrage de l'Application

Certaines applications sont difficiles à démarrer à partir d'une invite de commande, ou elles sont générées à partir d'autres processus. Pour ces applications, spécifier que, chaque fois qu'ils sont démarrés, un débogueur sera automatiquement leur être apposée. Cette option est utile si la page heap est activée pour les défaillances de ce processus et des tas se produit. Pour plus d'informations, consultez le paramètre /Debug .

PageHeap.exe est efficace lorsqu'il est utilisé pour Vérifiez que tout processus d'allocation de mémoire, y compris les allocations de style C++ nouvelles et supprimer, dans la mesure où les fonctions personnalisées d'allocation/libération appellent finalement NT interfaces de gestion de tas (c'est-à-dire, RtlAllocateHeap, RtlFreeHeap). Le les fonctions suivantes sont garanties pour ce faire :
  • Fonctionne comme HeapAlloc, HeapFree, HeapReAlloc: ces fonctions sont exportées par kernel32.dll et appeler directement dans les interfaces de tas NT. Fonctionne comme GlobalAlloc, GlobalFree, GlobalReAlloc: ces fonctions sont exportées par kernel32.dll et appeler directement ou indirectement dans le NT des interfaces de tas.
  • Fonctionne comme LocalAlloc, LocalFree, LocalReAlloc: ces fonctions sont exportées par kernel32.dll et appeler directement ou indirectement dans le NT des interfaces de tas.
  • Fonctions malloc, free, realloc, msize, Développez: ces fonctions sont exportées par msvcrt.dll et appeler directement ou indirectement dans le tas de NT. Cela n'a pas toujours été le cas. Le C Permet d'avoir une implémentation différents tas, mais le C en cours d'exécution lors de l'exécution des appels directement dans le tas de NT.
  • Nouveauxopérateurs, Supprimer, [nouveau] , de Supprimer [] : ces fonctions sont exportées par msvcrt.dll et appeler directement ou indirectement dans le tas de NT.
N'importe quel jeu allocation/libération des fonctions est probablement un personnalisé régime et n'est pas garanti à appeler directement ou indirectement dans NT segment de mémoire. Examen du code de la source uniquement ou en cours d'exécution sous le débogueur peut révéler le mise en oeuvre effective.

Évitez d'utiliser la liaison statique. Certaines applications ont été liées de manière statique aux anciennes versions du runtime C. Ces anciennes les versions n'appellent pas Windows NT tas API et Pageheap.exe ne peut pas être utilisé pour Vérifiez ces allocations. La liaison dynamique permet de s'assurer que vous obtenez la dernière c bibliothèque Runtime (msvcrt.dll).

Classes de bogues détectés par Pageheap.exe

PageHeap.exe détecte la plupart des bogues au tas ; Toutefois, il est axée sur les problèmes de corruption de segment de mémoire et ne se soucient pas de fuites. A PageHeap.exe succès limité avec recherche de fuites de tas, bien qu'il dispose de fonctionnalités à Cette cible.

Un des avantages de le Pageheap.exe est que de nombreuses des erreurs sont détectées lorsqu'elles surviennent. Par exemple, une erreur off-en-un octet à la fin d'une mémoire tampon allouée de manière dynamique peut provoquer un accès instantané violation. Il existe quelques types d'erreurs qui ne peuvent pas être détectés lorsque leur se produit. Dans ce cas, le rapport d'erreurs est retardé jusqu'à ce que le bloc est libéré.
  • Pointeur de segment de mémoire non valide: interfaces de tas au niveau de tous les Win32 et Windows NT prennent comme une première paramètre un pointeur vers le tas où l'opération doit se produire. La page Gestionnaire de tas détecte un pointeur de segment de mémoire non valide au moment de que l'appel est apportées.
  • Pointeur de bloc de tas non valide: une fois un bloc est alloué, il peut être utilisé en tant que paramètre pour plusieurs interfaces, notamment la classe free() d'interfaces de tas. Le tas de page Gestionnaire détecte immédiatement un pointeur de bloc de tas non valide. Consultez la Page de débogage Échecs de tas pour un moyen de déterminer si l'adresse non valide est quelques octets ou est complètement incorrect.
  • Accès non synchronisé multithread dans le tas: certaines applications appellent un segment de mémoire à partir de plusieurs threads. Cela type de scénario nécessite un indicateur (par l'utilisateur) qui déclenchera acquiert un verrou de segment de mémoire. Le Gestionnaire de tas page détecte ce type de violation Lorsque deux threads tentent d'appeler simultanément dans le tas.
  • Hypothèses à propos de la réaffectation d'un bloc à la même adresse: une opération de réaffectation n'est pas garantie pour renvoyer le même adresse. Ceci est particulièrement vrai lorsque la réallocation réduit la taille de la bloc. Certaines applications supposent que cette réaffectation retourneront la même adresse. Le Gestionnaire de tas page alloue toujours un nouveau bloc lors d'une réaffectation et libère l'ancien bloc. Le bloc libre est protégé pour l'accès en lecture/écriture, et Par conséquent, tout accès à celle-ci déclenche une violation d'accès.
  • Double free: ce bogue, où les mêmes blocs du tas sont libérées plusieurs fois, est commune dans certaines applications. Cette exception est immédiatement détectée par le tas de page Gestionnaire car, sur la seconde libre, le bloc aura pas le préfixe correct en-tête et ne figure pas parmi les blocs alloués. Consultez la Page débogage Heap Échecs de moyens pour analyser la trace de pile de la première opération libre. Cela erreur peut être une variante du problème de réallocation car, lorsque le application libère ce qu'il pense que c'est l'adresse du bloc, ce bloc a été déjà libérée dans le cadre de la réallocation.
  • De bloquer l'accès libre après: blocs de mémoire libérés sont conservés pendant une courte période par le tas de page gestionnaire dans un pool de mémoire protégée. Tout accès à ces blocs déclenchera une violation d'accès. Selon le principe de « localité », la plupart des problèmes doit être interceptée si le pool libre protégé est assez grand. Si le bloc libéré est toujours dans le pool protégé, le bogue est repéré instantanément. Toutefois, si le mémoire a été réutilisé, puis il y a moins de chance de trouver le bogue ou d'identification le code qui l'a provoquée.
  • Accès après la fin du bloc alloué: le Gestionnaire de tas page place une page inaccessible immédiatement le bloc alloué. Déclenche l'accès au-delà de la fin du bloc une violation d'accès. Certaines applications attendent des allocations pour être alignée sur 8 octets. Cette fonctionnalité a été pris en charge depuis les gestionnaires de tas de Windows NT 3.5. Une demande taille qui n'est pas alignée sur 8 octets reçoivent toujours une adresse alignée sur 8 octets, mais Cela laisse quelques octets après la fin du bloc qui sont toujours accessibles. Si l'application endommage uniquement ces quelques octets, l'erreur est interceptée uniquement en vérifiant le motif de suffixe bloc lorsque le bloc est libéré.
  • Accès avant le début du bloc alloué: le Gestionnaire de segments de page, vous pouvez demander à travers un indicateur définissable placer la page inaccessible au début du bloc, et non pas au la fin. Tout accès avant le début du bloc déclenchera un accès violation.
Réduire ce tableauAgrandir ce tableau
ÉchecTas de page normalSegment de mémoire pleine page
Pointeur de segment de mémoire non valideCapturés instantanémentInterceptée instantanément
Pointeur de bloc de tas non valideInterceptée instantanémentCapturés instantanément
Accès non synchroniséCapturés instantanémentInterceptée instantanément
Hypothèse sur l'adresse de réaffectation90 % jusqu'à réel libre90 % capturés instantanément
Double free90 % capturés instantanément90 % interceptée instantanément
Réutiliser après libre90 % jusqu'à ce que real gratuit90 % capturés instantanément
Accès après la fin du blocInterceptée lors de la libreCapturés instantanément
Accès avant le début du blocInterceptée lors de la libreCapturés instantanément (indicateur spécial)

Défaillances de Page tas de débogage

Pour plus d'informations sur le débogage des échecs de tas de Page, consultez le site : au niveau de Référence du Kit de ressources de compatibilité d'Application disponibles à l'intérieur de la compatibilité des applications Shared Computer Toolkit.

Pour la syntaxe de Pageheap.exe et des exemples d'utilisation de Pageheap.exe, veuillez consulter la Référence du Kit de ressources de compatibilité d'Application disponibles à l'intérieur de la compatibilité des applications Shared Computer Toolkit.

Pour plus d'informations reportez-vous aux rubriques ci-dessous Article de la Base de connaissances Microsoft :
294895  (http://support.microsoft.com/kb/294895/ ) Comment faire pour obtenir le Shared Computer Toolkit de compatibilité d'Application Windows

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
  • Microsoft Windows XP Professional
  • Microsoft Windows XP Édition familiale
  • Microsoft Windows 2000 Professionnel
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
Mots-clés : 
kbenv kbinfo kbmt KB286470 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 286470  (http://support.microsoft.com/kb/286470/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Partager
Options de support supplémentaire
Forums du support Microsoft Community
Nous contacter directement
Trouver un partenaire Microsoft Certified Partner
Microsoft Store