Загрузка данных


Вот полный, готовый текст отчёта, структурированный строго по пунктам методички. Вам остаётся только скопировать его в Word и вставить свои скриншоты в отмеченные места [Скриншот ...].
Практическая работа №2
Тема: Отладка, управление исключениями и профилирование приложений в среде Microsoft Visual Studio
Цель работы: Освоить базовые и расширенные инструменты отладчика Visual Studio (точки останова, условные остановы, окна инспектирования данных), настроить перехват исключений и провести профилирование использования ресурсов процессора и оперативной памяти.
Задание 1. Базовая отладка и исследование окон переменных
1. Исходный код программы
Для демонстрации пошаговой отладки, работы цикла, рекурсивного вызова и инспектирования переменных использован следующий код:
#include <iostream>

using namespace std;

// Рекурсивная функция для демонстрации шагов с заходом/выходом
void count(int nach, int kon) {
    if (nach <= kon) {
        cout << nach << endl;
        nach++;
        count(nach, kon);
    }
}

int main() {
    // Цикл для демонстрации работы точек останова
    for (int i = 1; i <= 10; i++) {
        cout << i << endl; // Строка 16
    }
    
    cout << endl;
    count(1, 10);

    return 0;
}

2. Описание выполненных действий
 * Установка обычной точки останова:
   На строке 16 (cout << i << endl;) была установлена стандартная точка останова (клавиша F9). При запуске отладки (F5) выполнение программы было приостановлено на первой же итерации цикла.
 * Пошаговое выполнение:
   Были протестированы различные режимы пошаговой отладки:
   * Шаг с обходом (F10 / Step Over): позволяет выполнять инструкции построчно в пределах текущего метода. При встрече вызова функции она выполняется целиком без погружения во внутренний код.
   * Шаг с заходом (F11 / Step Into): при наличии вызова функции (count(1, 10)) отладчик переходит внутрь тела вызываемой функции для анализа её начальных строк.
   * Шаг с выходом (Shift + F11 / Step Out): мгновенно выполняет оставшиеся инструкции текущей вложенной функции и возвращает управление в вызвавшую функцию main.
 * Установка условной точки останова:
   Через контекстное меню точки останова на строке 16 было открыто окно «Условия...» и задано логическое выражение i == 5. При продолжении отладки программа автоматически пропустила первые четыре итерации и остановилась ровно тогда, когда значение переменной i стало равным 5.
3. Исследование окон инспектирования состояния отладчика
В момент остановки программы на шаге i == 5 были исследованы специализированные окна отладки:
 * «Видимые» (Autos):
   Автоматически отслеживает контекст выполнения и выводит только те переменные, которые используются непосредственно на текущей активной строке и предыдущей выполненной инструкции. Отсекает нерелевантные в данный момент данные.
 * «Локальные» (Locals):
   Отображает полный список всех переменных и параметров, объявленных в текущей области видимости (внутри текущего блока/функции), независимо от того, задействованы ли они на конкретной строке в данный момент.
 * «Контрольные значения» (Watch):
   Настраиваемое окно для мониторинга. Позволяет вручную вводить как имена отдельных переменных (i), так и составные выражения (например, i * 2 или логические проверки i == 5), автоматически пересчитывая их на каждом шаге отладки.
 * «Быстрая проверка» (QuickWatch / Shift + F9):
   Модальное диалоговое окно для разовой оперативной проверки значения переменной или вычисления выражения без необходимости добавлять его в постоянный список окна Watch.
4. Иллюстрации к Заданию 1
[Скриншот: Установка условной точки останова i == 5 на строке 16]
[Скриншот: Окно «Быстрая проверка» (QuickWatch) со значением переменной i]
[Скриншот: Окно «Контрольные значения» (Watch 1) со списком отслеживаемых параметров]
[Скриншот: Окно «Локальные»]
[Скриншот: Окно «Видимые»]
Задание 2. Управление исключениями
1. Исходный код программы
Для демонстрации обработки системных сбоев и генерации аппаратного исключения был написан код с операцией целочисленного деления на ноль:
#include <iostream>

using namespace std;

int main() {
    int a = 10;
    int b = 0;
    
    // Попытка деления на ноль вызывает исключение 0xC0000094
    cout << a / b; 

    return 0;
}

2. Описание выполненных действий
 * Настройка отладчика:
   Во время работы отладчика через меню Отладка \rightarrow Окна \rightarrow Параметры исключения (Ctrl + Alt + E) было открыто окно настройки политики прерываний.
 * В категории Win32 Exceptions был найден и отмечен флаг прерывания для исключения 0xC0000094 Integer division by zero. Это указывает отладчику мгновенно приостанавливать выполнение при возникновении данной ошибки.
 * Демонстрация остановки:
   При запуске отладки (F5) программа остановилась на строке 7 (cout << a / b;). Отладчик вывел уведомление: «Необработанное исключение по адресу ... в Project3.exe: 0xC0000094: Integer division by zero», зафиксировав точное место сбоя и сохранив состояние переменных на момент ошибки.
 * Экспорт параметров:
   Конфигурация параметров среды и отладки была экспортирована через встроенный мастер среды (Средства \rightarrow Импорт и экспорт параметров...) в файл настроек.
3. Иллюстрации к Заданию 2
[Скриншот: Окно «Параметры исключения» с отмеченным флагом прерывания на Integer division by zero]
[Скриншот: Остановка отладчика на сбойной строке с диалоговым окном необработанного исключения 0xC0000094]
Задание 3. Профилирование производительности
1. Исходный код программы
Для создания выраженной вычислительной нагрузки на центральный процессор и моделирования выделения оперативной памяти использован следующий код:
#include <iostream>

int main() {
    // 1. Интенсивные вычисления (нагрузка на ЦП)
    for (int i = 0; i < 500000000; i++);

    // 2. Динамическое выделение памяти в куче (нагрузка на ОЗУ)
    int* a = new int[50000000];

    return 0;
}

2. Описание выполненных действий
 * Запуск профилировщика:
   Через меню Отладка \rightarrow Профилировщик производительности... (Alt + F2) было открыто окно выбора средств диагностики.
 * Были активированы два диагностических модуля:
   * «Использование ЦП» — для выявления наиболее ресурсоёмких функций и узких мест в коде.
   * «Использование памяти» — для отслеживания динамики работы с кучей и контроля потенциальных утечек памяти.
 * После нажатия кнопки «Запуск» приложение выполнило итерации цикла и аллокацию памяти, после чего процесс штатно завершился, а профилировщик сформировал сводный отчёт.
 * Анализ результатов:
   * ЦП: Анализ дерева вызовов («Критический путь») показал, что функция main заняла более 93% всего процессорного времени приложения из-за выполнения 500 млн холостых итераций.
   * Память: Средство профилирования зафиксировало момент выделения динамического блока памяти без утечек по завершении процесса.
 * Итоговый диагностический сеанс был сохранён на диск в виде файла отчёта с расширением .diagsession.
3. Иллюстрации к Заданию 3
[Скриншот: Окно выбора средств профилировщика с установленными галочками «Использование ЦП» и «Использование памяти»]
[Скриншот: Вкладка отчёта «Использование ЦП» с критическим путём функции main и круговой диаграммой нагрузки]
[Скриншот: Вкладка отчёта «Использование памяти»]
Вывод
В ходе выполнения практической работы были изучены инструменты отладки Visual Studio: отработана установка обычных и условных точек останова, изучена специфика окон отслеживания переменных («Локальные», «Видимые», «Контрольные значения», «Быстрая проверка»). Была настроена система перехвата критических исключений времени выполнения на примере деления на ноль. С помощью встроенного профилировщика производительности были собраны и проанализированы метрики нагрузки на ЦП и выделения оперативной памяти, а результаты сеанса сохранены в отчётный файл.