Condividi tramite


Esempio crt_dbg2: funzioni hook di debug del runtime del linguaggio C

Aggiornamento: novembre 2007

Nell'esempio crt_dbg2 vengono illustrati diversi modi per utilizzare le funzioni hook di debug con le versioni di debug della libreria di runtime del linguaggio C. Per conferire un maggiore realismo, sono stati inseriti alcuni elementi di un'applicazione reale, tra cui due bug.

Nota:

Questo esempio non può essere eseguito in computer con processore Itanium Intel.

Nota sulla sicurezza:

Il codice di esempio viene fornito per illustrare un concetto e non deve essere utilizzato in applicazioni o siti Web in quanto potrebbe non rappresentare le procedure di codifica più sicure. Microsoft esclude qualsiasi responsabilità di danni diretti o indiretti qualora il codice di esempio venga utilizzato per scopi diversi da quelli a cui è destinato.

Per ottenere gli esempi e le istruzioni per l'installazione:

  • In Visual Studio scegliere Esempi dal menu ?.

    Per ulteriori informazioni, vedere Individuazione dei file di esempio.

  • La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.

  • È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.

Generazione ed esecuzione dell'esempio

Per generare ed eseguire l'esempio

  1. Aprire il file di soluzione crt_dbg2.sln.

  2. Scegliere Genera dal menu Genera.

  3. Scegliere Avvia senza eseguire debug dal menu Debug.

Funzionamento dell'esempio

Il programma consente di memorizzare informazioni sulle date di nascita in un elenco collegato di blocchi Client. Una funzione hook del dump client convalida i dati relativi al compleanno e riporta il contenuto dei blocchi Client. Una funzione hook di allocazione registra le operazioni heap in un file di testo e la funzione hook di report registra i report selezionati nello stesso file.

Si noti che la funzione hook di allocazione comporta l'esclusione esplicita dei blocchi CRT (la memoria allocata internamente dalla libreria di runtime del linguaggio C) dal relativo log. La funzione hook utilizza fprintf per scrivere nel file di log, mentre fprintf esegue l'allocazione di un blocco CRT. Se in questo caso i blocchi CRT non venissero esclusi, un ciclo infinito determinerebbe un overflow dello stack: fprintf provocherebbe la chiamata alla funzione hook che a sua volta chiamerebbe fprintf che di nuovo provocherebbe la chiamata alla funzione hook e così via.

Per segnalare i blocchi di tipo CRT nell'hook di allocazione, è possibile utilizzare le funzioni API Windows anziché le funzioni del runtime del linguaggio C. Poiché le API Windows non utilizzano l'heap CRT, la funzione hook non viene bloccata in un ciclo infinito.

L'heap di debug individua due bug e un errore nei dati del secondo esempio. Un bug riguarda il campo del nome relativo al compleanno, che non è sufficientemente ampio per contenere i diversi nomi del test. Il campo deve essere più largo e va pertanto utilizzato strncpy invece di strcpy. Il secondo bug è determinato dal fatto che il ciclo while nella funzione printRecords non dovrebbe terminare se non quando HeadPtr è uguale a null. Questo bug comporta non solo una visualizzazione incompleta dei compleanni, ma anche una perdita di memoria. Infine, il compleanno di Gauss dovrebbe essere il 30 aprile e non il 32 aprile.

Parole chiave

Nell'esempio vengono utilizzate le parole chiave seguenti:

_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

Vedere anche

Altre risorse

Esempi generali