Поделиться через


Образец crt_dbg2: отладочные функции-ловушки для среды выполнения C

Образец crt_dbg2 демонстрирует несколько способов использования функций-ловушек при отладке библиотеки времени выполнения C. Для большей реалистичности в него включен ряд элементов фактически существующего приложения, в котором есть две ошибки.

Примечание

Этот образец не поддерживается для процессоров Intel Itanium.

Примечание о безопасностиПримечание по безопасности

Этот пример кода иллюстрирует концепцию и содержит только код, относящийся к этой концепции. Он может не отвечать требованиям безопасности для конкретных условий, и его не следует использовать в точности в том виде, в каком он приведен. Чтобы проект был безопасным и надежным, рекомендуется добавить код обеспечения безопасности и код обработки ошибок. Корпорация Майкрософт предоставляет этот пример кода на условиях "КАК ЕСТЬ", без каких-либо гарантий.

Чтобы получить образцы и инструкции по их установке, выполните следующие действия.

Доступ к примерам из Visual Studio

  • В меню Справка выберите пункт Примеры.

    По умолчанию эти примеры устанавливаются в папку диск:\Program Files\Microsoft Visual Studio 10.0\Samples\.

  • Самая последняя версия этого примера и полный список примеров представлены на странице Visual Studio Samples на веб-сайте MSDN.

Построение и запуск образца

Построение и запуск этого образца

  1. Откройте решение crt_dbg2.sln.

  2. В меню Построение выберите команду Построить.

  3. Из меню Отладка выберите пункт Запуск без отладки.

Принцип работы образца

Программа записывает даты рождения в связанный список клиентских блоков. Функция-ловушка клиентского дампа проверяет данные о днях рождения и сообщает о содержимом клиентских блоков. Функция-ловушка выделения памяти записывает операции кучи в текстовый файл журнала, а функция-ловушка отчета записывает выбранные отчеты в тот же текстовый файл.

Обратите внимание, что функция-ловушка выделения памяти прямо исключает из своего журнала блоки CRT (выделенные библиотекой времени выполнения C). Эта ловушка использует функцию fprintf для записи в файл журнала, и fprintf выделяет память для блока CRT. Если блоки CRT при этом не были бы исключены, возник бы бесконечный цикл, приводящий к переполнению стека: fprintf вызывает ловушку, ловушка в свою очередь вызывает функцию fprintf, та вновь вызывает ловушку и т. д.

Чтобы ловушка выделения памяти сообщала о блоках типа CRT, можно использовать API-функции Windows вместо функций времени выполнения C. Поскольку API-функции Windows не используют кучу CRT, они не будут перехватывать ловушку в бесконечном цикле.

Отладочная куча обнаруживает две ошибки программы и ошибку данных во втором примере. Первая ошибка заключается в том, что размер поля имени дня рождения недостаточен для размещения нескольких тестовых имен. Следует увеличить это поле и использовать strncpy вместо strcpy. Вторая ошибка программы состоит в том, что цикл while в функции printRecords не должен заканчиваться прежде, чем указатель HeadPtr сам примет значение NULL. В результате дни рождения отображаются в неполном виде и, кроме того, имеет место утечка памяти. И наконец, день рождения Гаусса — 30 апреля, а не 32 апреля.

Ключевые слова

В этом образце используются следующие ключевые слова:

_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

См. также

Другие ресурсы

Общие образцы