crt_dbg2, exemple : fonctions de raccordement du débogage du runtime C
L'exemple crt_dbg2 illustre plusieurs manières d'utiliser les fonctions de raccordement du débogage avec les versions debug de la bibliothèque Runtime C. Pour plus de réalisme, il comprend quelques éléments d'une application réelle, y compris deux bogues.
Notes
Cet exemple n'est pas pris en charge sur les processeurs Itanium d'Intel.
Note de sécurité |
---|
Cet exemple de code est destiné à illustrer un concept ; il présente uniquement le code qui se rapporte spécifiquement à ce concept. Il est possible qu'il ne réponde pas aux exigences de sécurité d'un environnement spécifique, et ne doit pas être utilisé exactement comme indiqué. Nous vous recommandons d'ajouter du code de sécurité et de gestion des erreurs afin de renforcer la sécurité et la fiabilité de vos projets. Microsoft fournit cet exemple de code « EN L'ÉTAT » sans aucune garantie. |
Pour obtenir des exemples et des instructions d'installation :
Pour accéder aux exemples de Visual Studio
Dans le menu Aide, cliquez sur Exemples.
Par défaut, ces exemples sont installés sous lecteur:\Program Files\Microsoft Visual Studio 10.0\Samples\.
- Pour obtenir la version la plus récente de cet exemple et la liste des autres exemples, consultez Exemples Visual Studio (page éventuellement en anglais) sur le site Web MSDN.
Génération et exécution de l'exemple
Pour générer et exécuter cet exemple
Ouvrez la solution crt_dbg2.sln.
Dans le menu Générer, cliquez sur Générer.
Dans le menu Déboguer, sélectionnez Exécuter sans débogage.
Fonctionnement de l'exemple
Ce programme stocke des dates de naissance dans une liste liée de blocs Client. Une fonction de raccordement du dump mémoire de Client valide les données relatives aux dates d'anniversaire et signale le contenu des blocs Client. Une fonction de raccordement d'allocation enregistre les opérations sur les tas dans un fichier texte et la fonction de raccordement de rapport enregistre les rapports sélectionnés dans le même fichier texte.
Notez que la fonction de raccordement d'allocation exclut explicitement de son journal les blocs CRT (mémoire allouée en mode interne par la bibliothèque Runtime C). La fonction de raccordement utilise fprintf pour écrire dans le fichier journal et fprintf alloue un bloc CRT (C Run-Time, runtime C). Si les blocs CRT n'étaient pas exclus dans ce cas, une boucle sans fin provoquerait un dépassement de la pile : fprintf provoquerait l'appel à la fonction de raccordement, laquelle appellerait à son tour fprintf qui entraînerait à nouveau l'appel à la fonction de raccordement, et ainsi de suite.
Pour utiliser des blocs de type CRT dans votre raccordement d'allocation, vous pouvez faire appel aux fonctions de l'API Windows à la place des fonctions du runtime C. Dans la mesure où les API Windows n'utilisent pas le tas CRT, il n'y a aucun risque de créer une boucle de raccordement sans fin.
Le tas de débogage intercepte deux bogues et une erreur de données dans le deuxième exemple. Le premier bogue est que le champ du nom n'est pas assez long pour contenir plusieurs noms de tests. Ce champ devrait être plus long et strncpy devrait remplacer strcpy. Le second bogue est que la boucle While de la fonction printRecords ne doit pas se terminer tant que HeadPtr n'est pas nul. Il se traduit par un affichage incomplet des dates de naissance et par une fuite de mémoire. Enfin, l'anniversaire de Gauss est le 30 avril et non le 32 avril.
Mots clés
Cet exemple utilise les mots clés suivants :
_assert ; _asserte ; _crtcheckmemory ; _crtmemcheckpoint ; _crtmemdumpallobjectssince ; _crtmemdumpstatistics ; _crtsetallochook ; _crtsetdbgflag ; _crtsetdumpclient ; _crtsetreportfile ; _crtsetreporthook ; _crtsetreportmode ; _free_dbg ; _malloc_dbg ; _rpt4 ; _strdate ; _strtime ; aboutbox ; clear_crt_debug_field ; createinstance ; createrecord ; displaystring ; donttouch ; exit ; fatalerror ; fclose ; fflush ; fopen ; fprintf ; fputs ; get_size ; helpstring ; id ; iid_is ; module ; myallochook ; mydumpclienthook ; myreporthook ; pointer_default ; printf ; printrecords ; put_size ; set_crt_debug_field ; strcpy_s ; strstr ; uuid