99.58K
Category: softwaresoftware

ИСРПО. Отладка программных продуктов. Инструменты отладки. Отладочные классы

1.

ИСРПО
Отладка программных продуктов.
Инструменты отладки. Отладочные
классы.

2.

Отладка
Отладка (debugging) – процесс нахождения
местоположения ошибок в программе и их
исправление.
Основное средство обнаружения ошибок
при отладке – тестирование.
Трудоемкость отладки часто превышает
суммарную трудоемкость разработки
алгоритма, программирования (кодирования)
и тестирования. Затраты времени на отладку
составляют от 50 до 80% общего времени
разработки программы.

3.

Отладка
Причины, определяющие значительную трудоемкость
процесса отладки, - нарушение программистами дисциплины
структурной методологии, т.е. принципа формальности,
который требует следования при проектировании и
кодировании формальным правилам и методам разработки
структурных программ.
Повышают эффективность отладки:
• априорные (на основании опыта) знания о статистике ошибок и
наиболее вероятных типах;
• знания о структуре программы и об участках программы, в
наибольшей степени предрасположенных к ошибкам.
Наиболее эффективный – групповой метод отыскания
ошибок, когда два программиста сначала независимо, а затем
совместно осуществляют этот процесс. Также возможно
повышение эффективности отладки путем попеременного
внимательного анализа программы за столом и машинного
тестирования.

4.

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

5.

Инструменты отладки
В процессе отладки используются различные отладочные
инструменты, такие как отладчики (debuggers),
профилировщики (profilers), логгеры (loggers) и другие.
Инструменты отладки - это программные средства,
предназначенные для облегчения процесса отладки
программного обеспечения путем предоставления различных
функций и возможностей для анализа, отслеживания и
исправления ошибок в коде.
• Отладчики (Debuggers)
Отладчики являются основным инструментом отладки и
предоставляют возможность выполнения кода пошагово,
контроля выполнения программы, просмотра значений
переменных, установки точек останова и других операций. Они
позволяют программистам легко отслеживать и анализировать
работу программы, выявлять ошибки и искать причины
некорректного поведения. Примеры популярных отладчиков –
GDB (GNU Debugger) для C/C++, Visual Studio Debugger для C++,
WinDbg для Windows и LLDB для Objective-C и Swift.

6.

Инструменты отладки
Работа отладчиков обычно основана на следующих ключевых функциях
и принципах:
1. Установка точек останова
Основная функция отладчиков - установка точек останова (breakpoints) в
программном коде. Точка останова указывает отладчику место в программе,
где выполнение должно быть приостановлено для анализа. После установки
точки останова отладчик приостановит выполнение программы при
достижении этой точки.
2. Построение стека вызовов
Отладчики отслеживают стек вызовов (call stack), который содержит
информацию о последовательности вызовов функций в программе. При
остановке выполнения программы отладчик показывает текущее состояние
стека вызовов, что помогает программисту понять контекст выполнения кода.
3. Шаги выполнения
Отладчики предоставляют возможность выполнения кода пошагово, что
позволяет программистам анализировать каждую инструкцию и ее влияние
на состояние программы. Программист может выполнять шаги исполнения
(step into), шаги в функцию (step over), шаги из функции (step out) для
детального анализа кода.
4. Просмотр значений переменных
Отладчики позволяют просматривать значения переменных в текущем
контексте выполнения программы. Программист может отслеживать и
изменять значения переменных во время выполнения программы, что
помогает выявлять и исправлять ошибки.

7.

Инструменты отладки
5. Обнаружение ошибок
Отладчики помогают обнаруживать ошибки в программе, такие как
некорректное использование указателей, выход за пределы массива,
неправильное управление памятью и другие типичные проблемы. При
обнаружении ошибки отладчик может выдать сообщение об ошибке и
указать на место в коде, где ошибка произошла.
6. Интерактивная отладка
Отладчики предоставляют интерактивную среду для анализа и исправления
проблем в программе. Приостановка выполнения программы, просмотр
значений переменных, выполнение шагов и другие операции позволяют
программисту активно взаимодействовать с кодом.
7. Мониторинг ресурсов
Некоторые отладчики предоставляют возможность мониторинга ресурсов,
таких как использование памяти, процессорного времени, сетевого трафика и
других параметров, что позволяет оптимизировать производительность
программы.
8. Анализ структуры данных
Отладчики могут помочь в анализе структуры данных, таких как массивы,
списки, деревья и другие структуры, что облегчает отслеживание и
исправление проблем, связанных с данными.

8.

Инструменты отладки
• Профилировщики (Profilers)
Профилировщики используются для анализа
производительности программы, выявления узких мест и
оптимизации кода. Они предоставляют информацию о времени
выполнения различных участков программы, использовании памяти,
вызовах функций, частоте вызовов и других метриках
производительности. Примеры профилировщиков – Valgrind, Intel
VTune, Xcode Instruments и Android Profiler.
Основные принципы работы профилировщиков:
1. Измерение времени выполнения
Основная функция профилировщиков - измерение времени
выполнения различных участков программы. Профилировщики могут
измерять общее время выполнения программы, время выполнения
отдельных функций, блоков кода, циклов и других участков кода.
2. Идентификация узких мест
Профилировщики помогают программистам идентифицировать
участки кода, которые занимают большую часть времени выполнения
программы (узкие места). Путем анализа результатов
профилирования программисты могут выявить функции или участки
кода, требующие оптимизации.

9.

Инструменты отладки
3. Сбор данных о потреблении ресурсов
Некоторые профилировщики также могут собирать данные о
потреблении ресурсов, таких как использование памяти,
процессорного времени, дискового пространства и других ресурсов.
Эти данные помогают программистам оптимизировать использование
ресурсов и улучшить производительность программы.
4. Визуализация результатов
Результаты профилирования обычно представляются в виде графиков,
диаграмм и отчетов, что облегчает визуальный анализ
производительности программы. Графики и диаграммы могут
показывать время выполнения различных функций, вызовы функций,
структуру вызовов и другие важные метрики.
5. Инструменты для оптимизации
Некоторые профилировщики могут предоставлять инструменты для
автоматической оптимизации кода на основе результатов
профилирования. Они могут предлагать рекомендации по улучшению
производительности, советы по оптимизации алгоритмов и структур
данных.

10.

Инструменты отладки
6. Изоляция проблем
Профилировщики помогают программистам
изолировать проблемные участки кода, которые
могут вызывать ухудшение производительности
программы. Это позволяет программистам
сосредоточить усилия на оптимизации и улучшении
этих участков.
7. Мониторинг изменений
Некоторые профилировщики позволяют
программистам мониторить изменения
производительности программы после внесения
оптимизаций, что помогает оценить эффективность
внесенных изменений и продолжать работу над
улучшением производительности.

11.

Инструменты отладки
• Логгеры (Loggers)
Логгеры используются для записи информации о работе
программы, значениях переменных, сообщениях об ошибках и других
событиях во время выполнения программы. Они помогают
программистам отслеживать выполнение программы, выявлять
проблемы и анализировать работу кода. Примеры логгеров – log4j для
Java, spdlog для C++, logback для Kotlin и Python Logging для Python.
Работа логгеров основана на следующих ключевых принципах:
1. Инициализация логгера
В начале работы программы инициализируется логгер, который будет
использоваться для записи информации. Логгер обычно
настраивается на определенный уровень журналирования (например,
отладочные сообщения, информационные сообщения,
предупреждения, ошибки).
2. Запись сообщений
В процессе выполнения программы логгер используется для записи
сообщений различного уровня в лог-файлы или другие целевые места
хранения информации. Программисты могут использовать логгер для
регистрации различных событий, состояний переменных, ошибок и
других важных данных.

12.

Инструменты отладки
3. Уровни журналирования
Логгеры обычно поддерживают несколько уровней
журналирования, такие как DEBUG, INFO, WARN, ERROR, FATAL.
Каждый уровень соответствует определенной важности
сообщения, что позволяет программистам фильтровать
сообщения и анализировать только необходимую
информацию.
4. Форматирование сообщений
Логгеры часто предоставляют возможность форматирования
сообщений, включая в них информацию о времени, уровне
журналирования, источнике сообщения и других метаданных.
Форматирование сообщений делает журнал более читаемым и
информативным.
5. Обработка ошибок
Логгеры могут использоваться для обработки и регистрации
ошибок в программе, что помогает программистам быстро
выявлять и исправлять проблемы. Запись сообщений об
ошибках помогает в дальнейшем анализе причин ошибок и
улучшении стабильности программы.

13.

Инструменты отладки
6. Целевые места хранения информации
Логгеры могут записывать сообщения в различные
целевые места хранения информации, такие как
консоль, файлы журналов, базы данных, удаленные
серверы и другие. Это позволяет программистам
выбирать подходящий способ сохранения и анализа
журналов в зависимости от требований проекта.
7. Анализ и мониторинг
Журналы, созданные логгерами, могут использоваться
для анализа работы программы, мониторинга ее
состояния, выявления проблем и улучшения
производительности. Программисты могут
использовать журналы для отслеживания выполнения
программы, выявления узких мест и оптимизации
работы кода.

14.

Инструменты отладки
• Анализаторы кода (Code Analyzers)
Анализаторы кода используются для автоматического
поиска потенциальных проблем в программном коде, таких как
утечки памяти, нарушения доступа к памяти, неопределенное
поведение и другие ошибки. Они помогают программистам
выявлять и исправлять ошибки в коде на ранних этапах
разработки. Примеры анализаторов кода – PVS-Studio,
SonarQube, Coverity и Clang Static Analyzer.
Работа анализаторов кода основана на следующих
принципах:
1. Сканирование и анализ кода
Анализаторы кода сканируют и анализируют исходный код
программы с целью выявления различных проблем, таких как
нарушения стандартов кодирования, потенциальные
уязвимости, ошибки в логике программы и другие недочеты.
2. Статический анализ
Большинство анализаторов кода используют статический
анализ, который проводится без фактического выполнения
программы. Они анализируют исходный код на предмет
возможных проблем до его выполнения.

15.

Инструменты отладки
3. Поддержка языков программирования
Анализаторы кода обычно поддерживают различные языки
программирования, такие как Java, C/C++, Python, JavaScript и другие.
Каждый анализатор специализируется на конкретном языке или
наборе языков.
4. Выявление ошибок и уязвимостей
Анализаторы кода могут выявлять различные типы ошибок, такие как
утечки памяти, неопределенное поведение, неправильное
использование переменных, нарушения стандартов кодирования и
другие проблемы.
5. Поиск потенциальных улучшений
В дополнение к выявлению ошибок, анализаторы кода могут
указывать на возможные улучшения кода, оптимизации
производительности, упрощения алгоритмов и другие рекомендации
по улучшению качества кода.
6. Интеграция в среды разработки
Многие анализаторы кода могут интегрироваться в популярные среды
разработки, такие как Visual Studio, IntelliJ IDEA, Eclipse и другие, что
позволяет программистам проводить анализ кода прямо в процессе
разработки.

16.

Инструменты отладки
7. Генерация отчетов
После анализа кода анализаторы могут генерировать отчеты,
содержащие информацию о найденных проблемах,
рекомендациях по улучшению и других результатов анализа.
8. Автоматизация процесса проверки
Использование анализаторов кода позволяет автоматизировать
процесс проверки качества кода, что упрощает выявление и
исправление проблем на ранних этапах разработки.
9. Использование правил и шаблонов
Анализаторы кода работают на основе определенных правил и
шаблонов, которые помогают определить, что считать ошибкой
или потенциальным улучшением кода.
10. Поддержка командной работы
Некоторые анализаторы кода поддерживают работу в команде,
позволяя программистам совместно анализировать код,
делиться результатами и управлять процессом улучшения
качества кода.

17.

Инструменты отладки
• Утилиты трассировки (Tracing Tools)
Утилиты трассировки (также известные как трассировщики)
используются для анализа работы программы и выявления
времени выполнения различных операций. Они позволяют
программистам оптимизировать производительность
программы, идентифицировать узкие места и улучшать работу
кода. Примеры утилит трассировки – Linux strace, Windows
Performance Toolkit и DTrace для macOS.
Работа утилит трассировки основана на следующих
принципах:
1. Захват данных выполнения
Утилиты трассировки захватывают данные о выполнении
программы, такие как вызовы функций, передача параметров,
обращения к памяти, события ввода-вывода и другие
операции.
2. Обнаружение узких мест
Цель утилит трассировки - выявление узких мест в программе,
которые могут замедлять ее работу или вызывать проблемы.

18.

Инструменты отладки
3. Анализ вызовов функций
Утилиты трассировки позволяют анализировать
последовательность вызовов функций в программе, что
помогает понять структуру выполнения кода и оптимизировать
его.
4. Измерение производительности
С помощью утилит трассировки можно измерить
производительность программы, выявить узкие места,
определить, где требуется оптимизация.
5. Построение стека вызовов
Утилиты трассировки позволяют отслеживать стек вызовов (call
stack), что помогает понять последовательность выполнения
кода и контекст вызовов функций.
6. Отслеживание изменений переменных
Некоторые утилиты трассировки позволяют отслеживать
изменения значений переменных в программе, что помогает
выявить ошибки и проблемы в логике программы.

19.

Инструменты отладки
7. Разрешение проблем
Утилиты трассировки облегчают поиск и решение проблем в
программе, таких как утечки памяти, некорректное
использование ресурсов, ошибки в логике и другие.
8. Визуализация данных
Некоторые утилиты трассировки предоставляют возможность
визуализации данных выполнения программы, таких как
графики, диаграммы и другие формы отображения
информации.
9. Мониторинг процессов
Утилиты трассировки могут использоваться для мониторинга
процессов в реальном времени, что позволяет отслеживать
работу программы и ее состояние.
10. Поддержка отладки
Утилиты трассировки могут быть использованы в процессе
отладки программы для анализа ее работы, выявления
проблем и улучшения качества кода.

20.

Инструменты отладки
• Инструменты для работы с памятью (Memory Tools)
Инструменты для работы с памятью используются
для обнаружения утечек памяти, ошибок
выделения/освобождения памяти и других проблем,
связанных с управлением памятью. Они помогают
программистам избежать утечек памяти и повысить
стабильность программы. Примеры инструментов для
работы с памятью – Valgrind, AddressSanitizer, Purify и
Electric Fence.
Работа таких инструментов основана на следующих
принципах:
1. Мониторинг использования памяти
Инструменты для работы с памятью могут отслеживать,
сколько памяти занимает программа в процессе
выполнения, и выявлять утечки памяти или другие
проблемы с управлением памятью.

21.

Инструменты отладки
2. Выявление утечек памяти
Одной из основных задач таких инструментов является
выявление утечек памяти, когда программа выделяет память,
но не освобождает ее после завершения использования. Это
может привести к исчерпанию доступной памяти и снижению
производительности.
3. Анализ использования стека
Инструменты для работы с памятью могут анализировать
использование стека (stack) программы, что позволяет выявить
проблемные участки кода, потребляющие большое количество
памяти.
4. Оптимизация памяти
Некоторые инструменты предоставляют средства для
оптимизации использования памяти, такие как оптимизация
работы с объектами, уменьшение потребления памяти,
устранение утечек и т. д.
5. Анализ структуры данных
Инструменты для работы с памятью могут помочь
анализировать структуру данных, используемых в программе, и
выявлять возможности для улучшения использования памяти.

22.

Инструменты отладки
6. Обнаружение ошибок доступа к памяти
Некоторые инструменты способны обнаруживать ошибки
доступа к памяти, такие как чтение или запись за пределами
выделенной области памяти (buffer overflow), что может
привести к серьезным проблемам безопасности и
непредсказуемому поведению программы.
7. Поддержка отладки
Инструменты для работы с памятью могут использоваться для
отладки программы, помогая выявлять и исправлять проблемы
с управлением памятью, утечками и другими аномалиями.
8. Автоматический анализ кода
Некоторые инструменты могут проводить автоматический
анализ и проверку исходного кода на предмет проблем с
управлением памятью.
9. Отчеты и рекомендации
После анализа памяти инструменты могут генерировать отчеты,
содержащие информацию о найденных проблемах,
рекомендации по улучшению и другие результаты анализа.

23.

Отладочные классы
Отладочные классы – это классы, которые
используются для облегчения процесса отладки
программного обеспечения. Они предоставляют
различные инструменты и функциональность для
вывода информации об операциях, состоянии
программы, значениях переменных и других
аспектах работы программы во время выполнения.
Использование отладочных классов помогает
программистам выявлять ошибки, отслеживать
выполнение программы и улучшать ее
производительность.
Рассмотрим некоторые распространенные
отладочные классы и их функциональность:

24.

Отладочные классы
assert()
assert() является макросом, который используется
для проверки условий в программе во время
выполнения. Если условие, переданное в assert(),
оценивается как ложное, программа завершится с
вызовом функции abort() и выводом информации
об ошибке. Он часто используется для проверки
инвариантов, предусловий и постусловий функций.
Пример:
#include "assert.h"
int main(){
int x = 10;
assert(x > 100);
}

25.

Отладочные классы
std::cerr
std::cerr является стандартным потоком вывода ошибок
в C++ и используется для вывода сообщений об
ошибках. Отличается от std::cout тем, что сообщения
std::cerr обычно выводятся немедленно и не
буферизуются. Он часто используется для вывода
критических сообщений об ошибках.
Пример:
#include <iostream>
int main(){
int x = -10;
if (x < 0) {
std::cerr;
}
}

26.

Отладочные классы
int main() {
int x = 10, y = 0;
if (y == 0) {
std::cerr << "Error: Division by zero!" << std::endl;
} else {
std::cout << "Result: " << x / y << std::endl;
}
return 0;
}

27.

Отладочные классы
Логгер (logger)
Отладочный класс логгера (Debug Logger) - это
специальный инструмент, который используется
для записи отладочной информации во время
выполнения программы. Он обычно используется
для отслеживания состояния программы, вывода
значений переменных, сообщений об ошибках и
предупреждений.
Основная функция логгера - запись информации
в лог-файл или вывод на консоль. Это позволяет
программисту отслеживать работу программы и
выявлять возможные проблемы.

28.

Отладочные классы
Пример создания класса логгера:
#include <iostream>
#include <fstream>
class Logger {
private:
std::ofstream logfile;
public:
Logger(const char* filename) : logfile(filename, std::ios_base::app) {
if (!logfile.is_open()) {
std::cerr << "Ошибка открытия файла лога" << std::endl;
}
}
void log(const char* message) {
if (logfile.is_open()) {
logfile << message << std::endl;
}
}
Logger() {
if (logfile.is_open()) {
logfile.close();
}
}
};
int main() {
Logger logger("log.txt");
logger.log("Пример логгирования сообщения");
return 0;
}

29.

Отладочные классы
Таймер (timer)
Отладочный класс таймера (Debug Timer Class) - это
инструмент, который используется для измерения
времени выполнения определенных участков кода в
программе. Он позволяет разработчику оценить
производительность и эффективность своего кода,
выявить узкие места и оптимизировать работу
программы.
Обычно отладочный класс таймера предоставляет
методы для начала и завершения измерения времени.
После завершения измерения таймер вычисляет
разницу между временем начала и временем
окончания выполнения.
Хороший отладочный класс таймера обеспечивает
достаточную точность измерения времени для
обнаружения даже небольших изменений в
производительности.

30.

Отладочные классы
#include <iostream>
#include <ctime>
class Timer {
private:
clock_t start_time;
public:
Timer() : start_time(clock()) {}
void start() {
start_time = clock();
}
void stop() {
clock_t end_time = clock();
double elapsed_time = static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC;
std::cout << "Время выполнения: " << elapsed_time << " секунд" << std::endl;
}
};
int main() {
setlocale(0,"");
Timer timer;
// Начало измерения времени
timer.start();
// Симуляция выполнения какой-то работы
for (int i = 0; i < 100000000; ++i) {
// some work
}
// Конец измерения времени и вывод результата
timer.stop();
return 0;
}

31.

Отладочные классы
В этом примере класс Timer использует
функцию clock() для измерения времени
выполнения кода между вызовами методов
start() и stop(). Метод stop() вычисляет разницу
между временем начала и временем
окончания выполнения и выводит результат в
секундах.
Обратите внимание, что clock() измеряет
процессорное время, а не реальное, поэтому
результаты могут варьироваться в зависимости
от нагрузки на процессор и других факторов.

32.

Практическое задание
1. Написать программу для решения в целых
числах уравнения (ax + b)/с = 0, где a, b, c
вводятся с клавиатуры. Вывести результат.
Проверить необходимые для корректной
работы программы условия ввода с
помощью assert. Записать логи работы
программы в файл log.txt. Замерить время
выполнения программы и вывести на
экран.

33.

Практическое задание
2. Написать программу:
Даны длины сторон треугольника, определить
вид треугольника и его площадь.
1. Остроугольный треугольник
2. Тупоугольный треугольник
3. Прямоугольный треугольник
4. Разносторонний треугольник
5. Равнобедренный треугольник
6. Равносторонний треугольник
Вывести результат. Проверить необходимые для
корректной работы программы условия ввода с
помощью assert. Записать логи работы программы в
файл log.txt. Замерить время выполнения
программы и вывести на экран.

34.

Практическое задание
3. Написать программу для решения в целых
числах квадратного уравнения ax2 + bx + c =
0, где a, b, c вводятся с клавиатуры. Вывести
результат. Проверить необходимые для
корректной работы программы условия
ввода с помощью assert. Записать логи
работы программы в файл log.txt. Замерить
время выполнения программы и вывести
на экран.
English     Русский Rules