Ejemplo crt_dbg2: funciones de enlace de depuración de las bibliotecas en tiempo de ejecución de C

Actualización: noviembre 2007

El ejemplo crt_dbg2 ilustra varias maneras de utilizar funciones de enlace de depuración con las versiones de depuración de la biblioteca en tiempo de ejecución de C. Para lograr cierto realismo, tiene algunos elementos de una aplicación real, incluidos dos errores.

Nota:

Este ejemplo no se puede ejecutar con procesadores Itanium de Intel.

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuenciales en caso de que el código de ejemplo se utilice para otros propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Para generar y ejecutar este ejemplo

  1. Abra la solución crt_dbg2.sln.

  2. En el menú Generar, haga clic en Generar.

  3. En el menú Depurar, seleccione Iniciar sin depurar.

Cómo funciona el ejemplo

El programa almacena información sobre la fecha de nacimiento en una lista vinculada de bloques de cliente. Una función de enlace de volcado de clientes valida los datos de la fecha de nacimiento y notifica el contenido de los bloques de cliente. Una función de enlace de asignación registra operaciones del montón en un archivo de texto, y la función de enlace de informe registra informes seleccionados en ese mismo archivo de texto.

Tenga en cuenta que la función de enlace de asignación excluye explícitamente los bloques CRT (la memoria asignada internamente por la biblioteca en tiempo de ejecución de C) de su registro. La función de enlace utiliza fprintf para escribir en el archivo de registro y fprintf asigna un bloque CRT. Si no se excluyeran los bloques CRT en este caso, un bucle infinito produciría un desbordamiento de la pila: fprintf haría que se llamara a la función de enlace y ésta a su vez llamaría a fprintf, que volvería a llamar al enlace y así indefinidamente.

Para poder notificar bloques de tipo CRT en el enlace de asignación se podrían utilizar las funciones de la API de Windows en lugar de las funciones de la biblioteca en tiempo de ejecución de C. Como las API de Windows no utilizan el montón de CRT, no interceptarán el enlace en un bucle sin fin.

El montón de depuración intercepta dos errores y un error de datos en el segundo ejemplo. Uno de los errores es que el campo de fecha de nacimiento no es lo suficientemente grande para contener algunos de los nombres de prueba. El campo debería ser más amplio y se debe utilizar strncpy internamente, en lugar de strcpy. El segundo error es que el bucle while de la función printRecords no debe finalizar hasta que el valor de HeadPtr sea igual a null. Este error se debe no sólo a una presentación incompleta de las fechas de nacimiento, sino también a una fuga de memoria. Por último, el cumpleaños de Gauss debería ser el 30 de abril, no el 32 de abril.

Palabras clave

En este ejemplo se utilizan las siguientes palabras clave:

_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

Vea también

Otros recursos

Ejemplos generales