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


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

Обновлен: Ноябрь 2007

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

b31tft51.alert_note(ru-ru,VS.90).gifПримечание.

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

b31tft51.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению.

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

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

    Дополнительные сведения см. в разделе Поиск файлов примеров.

  • Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.

  • Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.

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

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

  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

См. также

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

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