Образец crt_dbg2: отладочные функции-ловушки для среды выполнения C
Образец crt_dbg2 демонстрирует несколько способов использования функций-ловушек при отладке библиотеки времени выполнения C. Для большей реалистичности в него включен ряд элементов фактически существующего приложения, в котором есть две ошибки.
Примечание
Этот образец не поддерживается для процессоров Intel Itanium.
Примечание по безопасности |
---|
Этот пример кода иллюстрирует концепцию и содержит только код, относящийся к этой концепции. Он может не отвечать требованиям безопасности для конкретных условий, и его не следует использовать в точности в том виде, в каком он приведен. Чтобы проект был безопасным и надежным, рекомендуется добавить код обеспечения безопасности и код обработки ошибок. Корпорация Майкрософт предоставляет этот пример кода на условиях "КАК ЕСТЬ", без каких-либо гарантий. |
Чтобы получить образцы и инструкции по их установке, выполните следующие действия.
Доступ к примерам из Visual Studio
В меню Справка выберите пункт Примеры.
По умолчанию эти примеры устанавливаются в папку диск:\Program Files\Microsoft Visual Studio 10.0\Samples\.
- Самая последняя версия этого примера и полный список примеров представлены на странице Visual Studio Samples на веб-сайте MSDN.
Построение и запуск образца
Построение и запуск этого образца
Откройте решение crt_dbg2.sln.
В меню Построение выберите команду Построить.
Из меню Отладка выберите пункт Запуск без отладки.
Принцип работы образца
Программа записывает даты рождения в связанный список клиентских блоков. Функция-ловушка клиентского дампа проверяет данные о днях рождения и сообщает о содержимом клиентских блоков. Функция-ловушка выделения памяти записывает операции кучи в текстовый файл журнала, а функция-ловушка отчета записывает выбранные отчеты в тот же текстовый файл.
Обратите внимание, что функция-ловушка выделения памяти прямо исключает из своего журнала блоки 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