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

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 seguridadNota sobre la seguridad

En este ejemplo de código se ilustra un concepto y únicamente se muestra el código correspondiente a dicho concepto. Es posible que no cumpla los requisitos de seguridad de un entorno concreto y, por tanto, no debería utilizarse tal y como se muestra. Se recomienda agregar código de seguridad y de control de errores para que los proyectos sean más seguros y sólidos. Microsoft proporciona este ejemplo "tal cual" sin ninguna garantía.

Para obtener ejemplos e instrucciones para su instalación:

Para obtener acceso a los ejemplos de Visual Studio

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

    De forma predeterminada, los ejemplos se instalan en unidad:\Archivos de programa\Microsoft Visual Studio 10.0\Samples\.

  • Para obtener la versión más reciente de este ejemplo, así como una lista de otros ejemplos, vea Visual Studio Samples en el sitio web de MSDN.

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.

Keywords

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