Гайд Перевод Learncpp.com: раздел 3.2 // Процесс отладки. На русском.

Dreammmless.
Эксперт
Статус
Оффлайн
Регистрация
19 Мар 2019
Сообщения
2,956
Реакции[?]
962
Поинты[?]
1K
Допустим, вы написали программу, и она работает неправильно - весь код компилируется нормально, но при запуске вы получаете неверный результат. У вас где-то должна быть семантическая ошибка. Как вы можете её найти? Если вы следовали рекомендациям, написав немного кода, а затем протестировав его, вы можете иметь хорошее представление о том, где находится ваша ошибка. А может быть, вы вообще ничего не знаете.

Все ошибки проистекают из простой предпосылки: то, что вы считали правильным, на самом деле не так. В этом уроке мы опишем общий процесс отладки программы.

Поскольку мы еще не рассмотрели так много тем C++, наши примеры программ в этой главе будут довольно простыми. Это может сделать некоторые из методов, которые мы показываем здесь, чрезмерными. Однако имейте в виду, что эти методы предназначены для использования с большими, более сложными программами и будут более полезны в таких условиях (где они вам больше всего нужны).


Общий подход к отладке

После того, как проблема была идентифицирована, отладка проблемы обычно состоит из пяти шагов:

  1. Найдите первопричину проблемы (обычно это строка кода, которая не работает)
  2. Убедитесь, что вы понимаете, почему возникает эта проблема
  3. Определите, как вы решите эту проблему
  4. Устраните проблему, вызвавшую эту проблему
  5. Повторите тест, чтобы убедиться, что проблема была исправлена и никаких новых проблем не возникло
Давайте воспользуемся здесь аналогией из реальной жизни. Допустим, однажды вечером вы идете за льдом из морозильника. Ты подносишь чашку к дозатору, нажимаешь, и ... ничего не выходит. Ой-ой. Вы обнаружили какой-то дефект. Что бы вы сделали? Вы, вероятно, начнете расследование, чтобы увидеть, сможете ли вы определить первопричину проблемы.


Найдите первопричину: поскольку вы слышите, как дозатор льда пытается доставить лед, это, вероятно, не сам механизм доставки льда. Итак, вы открываете морозильник и осматриваете лоток со льдом. Никакого льда. Является ли это основной причиной проблемы? Нет, это еще один симптом. После дальнейшего изучения вы определяете, что льдогенератор, по-видимому, не делает лед. Проблема в льдогенераторе или в чем-то другом? Морозильная камера все еще холодная, водопровод не засорен, и все остальное, кажется, работает, поэтому вы заключаете, что первопричина заключается в том, что льдогенератор не работает.

Поймите проблему: в данном случае это просто. Сломанный льдогенератор не делает льда.

Определите решение: на данный момент у вас есть несколько вариантов решения: вы можете обойти проблему (купить пакеты льда в магазине). Вы можете попытаться диагностировать льдогенератор дальше, чтобы увидеть, есть ли часть, которую можно починить. Вы можете купить новый льдогенератор и установить его вместо нынешнего. Или вы можете купить новый морозильник. Вы решили купить новый льдогенератор.

Устраните проблему: как только льдогенератор прибыл, вы устанавливаете его.

Повторное тестирование: после включения электричества и ожидания на ночь ваш новый льдогенератор начинает делать лед. Никаких новых проблем не обнаружено.

Теперь давайте применим этот процесс к нашей простой программе из предыдущего урока:
C++:
#include <iostream>

// Добавляет два числа
int add(int x, int y)
{
    return x - y; // функция должна добавлять, но это не так
}

int main()
{
    std::cout << add(5, 3) << '\n'; // должно вывести 8, но выводит 2
    return 0;
}
Этот код хорош в одном отношении: ошибка очень очевидна, потому что неправильный ответ печатается на экране через строку 11. Это дает нам отправную точку для нашего расследования.


Найдите первопричину: в строке 11 мы видим, что передаем литералы для Аргументов (5 и 3), поэтому там нет места для ошибки. Поскольку входные данные для функции add правильны, а выходные-нет, вполне очевидно, что функция add должна производить неправильное значение. Единственным оператором в функции add является оператор return, который должен быть виновником. Мы нашли проблемную линию. Теперь, когда мы знаем, где сосредоточить наше внимание, заметив, что мы вычитаем, а не добавляем, вы, вероятно, обнаружите это с помощью проверки.

Поймите проблему: в этом случае очевидно, почему генерируется неправильное значение - мы используем неправильный оператор.

Определите решение: мы просто изменим оператор- на оператор+.

Исправьте проблему: это фактически изменение оператора- на оператор+ и перекомпиляция программы.

Повторный тест: после реализации изменения повторный запуск программы покажет, что наша программа теперь выводит правильное значение 8. Для этой простой программы это все, что требуется для тестирования.

Этот пример тривиален, но иллюстрирует основной процесс, который вы будете проходить при диагностике любой программы.

Оригинальная статья -
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Сверху Снизу