Различные способы работы отладчиков

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

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

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

Хотя не существует фиксированной процедуры для исправления всех ошибок, есть несколько методов, которые могут уменьшить ваши усилия по отладке. Значительная (если не вся) часть этого процесса уходит на поиск места ошибки.

В этой статье мы обсудим три наиболее известных и используемых метода:

  • Отладка на основе трассировки
  • Отладка на основе спектра
  • Дельта-отладка

Для разных случаев лучше подходят разные техники. Не существует точного наилучшего метода. Все зависит от типа тестируемой кодовой базы и ваших предпочтений. Тем не менее, разработчикам целесообразно иметь знания и опыт работы со всеми этими подходами. Иногда комбинация одного или нескольких из этих подходов приведет вас к местонахождению ошибки.

Итак, приступим к отладке.

Отладка на основе трассировки

Отладка на основе трассировки является традиционным и наиболее распространенным методом отладки, используемым сегодня в большинстве инструментов отладки. Отладка на основе трассировки основана на концепции точек останова.

Точка останова - это точка приостановки или остановки, добавляемая к программе для проверки состояния выполнения программы до этой точки. После исправления текущей ошибки разработчик обычно устанавливает следующую точку останова и повторяет тот же процесс, пока не будут исправлены все ошибки.

Отладка на основе трассировки включает четыре вспомогательных метода.

  1. Отладка трассировки (TD)
  2. Всезнающая отладка (OD)
  3. Алгоритмическая отладка (AD)
  4. Гибридная отладка (HD)

Все эти под-техники основаны на одной и той же концепции: нарезке программ.

Нарезка

Нарезка программ - это метод, используемый в информатике для упрощения больших программ за счет сосредоточения внимания на меньшем выбранном разделе из них. В процессе нарезки удаляются части программы, которые не влияют или оказывают незначительное влияние на тестируемый аспект или общий вывод программы. В 1981 году Марк Вайзер, ученый-компьютерщик и технический директор Xerox PARC, определил программный фрагмент как:

«Ментальная абстракция, которую делают люди при отладке программы».

Программная нарезка используется во многих приложениях в информатике:

  1. Отладка.
  2. Обратный инжиниринг программы.
  3. Измерение охвата, перекрытия или кластеризации программы.
  4. Чтобы получить более глубокое понимание внутренней работы программы.

Существует несколько возможных подходов к нарезке программы, например статическая нарезка, динамическая нарезка, условная нарезка и аморфная нарезка.

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

  • Условная нарезка: при статической нарезке мы ничего не предоставляем о вводе. При динамической нарезке мы строим его на основе определенного ввода. Условная нарезка находится где-то посередине. В условном срезе мы можем предоставить информацию инструменту срезов о вводе, при этом не вдаваясь в подробности о точных значениях.
  • Аморфная нарезка: все предыдущие рассмотренные до сих пор нарезки представляют собой сохранение синтаксиса. Эти подходы построены путем удаления утверждений, не влияющих на рассматриваемый набор переменных. Однако аморфные срезы конструируются с использованием любого преобразования программы, что упрощает программу, сохраняя при этом функциональность всей программы.

Среди этих четырех типов динамическое нарезание является наиболее часто используемым методом отладки. Это связано с тем, что при отладке у нас есть конкретный тестовый пример, вызвавший ошибку, поэтому мы можем использовать этот тестовый пример в качестве входных данных для построения наших срезов.

Отладка трассировки

При отладке трассировки (TD) отладчик может установить точку останова, и когда точка останова достигается во время выполнения программы, программа приостанавливается. Затем программист может проверить состояние программы, запустив ее построчно. Отладчик берет на себя управление только интерпретатором, и, следовательно, масштабируемость TD такая же, как и у интерпретатора. Если в процессе определения местоположения ошибки ошибка обнаруживается до точки останова, процесс отладки необходимо перезапустить, чтобы ее отловить.

Всезнающая отладка

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

Алгоритмическая отладка

Алгоритмическая отладка (AD) - это полуавтоматический метод отладки, который создает диалог между отладчиком и разработчиком для поиска ошибок. Таким образом, нет необходимости видеть код для выполнения фактической отладки. Поэтому уровень абстракции AD высок. AD выполняется в два этапа: во-первых, он строит дерево выполнения данной программы. Затем построенное дерево выполнения исследуется во всех деталях.

Гибридная отладка

Гибридная отладка (HD) - это метод отладки, сочетающий отладку трассировки, всестороннюю отладку и алгоритмическую отладку. Во-первых, он использует отладку трассировки, чтобы выяснить, в какой части программы возникает ошибка. Затем он использует алгоритмическую отладку только в этой части программы и создает дерево ее выполнения. После этого он применяет всеведущую отладку к единственному методу, в котором алгоритмическая отладка выявила ошибку.

Отладка на основе спектра

При отладке на основе спектра, также известной как локализация сбоев на основе спектра (SFL), процесс отладки выполняется путем отслеживания операторов, включенных в конкретное дерево выполнения. Это достигается за счет использования спектра программы для идентификации активной части программы во время ее выполнения. Спектр программы - это набор информации времени выполнения , которая дает представление о динамическом поведении программы. Он включает несколько флагов, соответствующих различным частям программы. Существуют различные типы программных спектров, такие как block hit/miss и function hit/miss. Эти спектры используются для определения точных участков кода, выполняемых для конкретного или абстрактного ввода.

Дельта-отладка

Процесс дельта-отладки (DD) предназначен для минимизации автоматизированных тестовых случаев. Он берет тестовые примеры, которые могут вызвать ошибку, и готовит отчет об ошибке. Из этого отчета об ошибках выбираются минимальные тестовые примеры на основе их высокой вероятности возникновения ошибки. Минимальные тестовые примеры будут повторно генерировать ту же ошибку и, таким образом, помочь разработчику найти ошибку, стоящую за ней.

Заключение

Существует ряд других стратегий, которые можно использовать, чтобы помочь разработчику найти ошибки, существующие в коде. Как разработчик, я всегда напоминаю себе о нескольких вещах:

  • Ошибка может быть не там, где вы ее ищете. Иногда, когда разработчик ищет ошибку, он тратит много времени на проверку определенного раздела кода, чтобы выяснить, что ошибка находится в другом месте. .
  • Взгляд на проблему под другим углом дает другую перспективу. И, указав на части кода, в которых нет ошибок, мы можем выявить, где на самом деле ошибка.
  • Проверьте входные данные и детали теста. Иногда тестовый пример может быть нарушен. Так что всегда полезно пройти через это и убедиться, что все в порядке.

Все вышеперечисленное - это методы, используемые для обнаружения ошибок, но что дальше?

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

Это вторая статья из серии, в которой обсуждается все, что касается отладки и отладчиков. Первая статья была:

  • Все об отладке: Введение. Он дал обзор отладки, почему это важный инструмент / навык разработчиков программного обеспечения, а также разницу между отладкой и тестированием.

Следующие статьи будут:

  • Все об отладке: специальные системы. Я буду обсуждать отладку специальных систем, таких как крупномасштабная отладка, отладка параллельных систем и многое другое.
  • Все об отладке: расширенные подходы. Я буду обсуждать оставшиеся без ответа вопросы об отладчиках, визуальных отладчиках и последних исследованиях в области отладки.

использованная литература

  1. Б. Корел, Дж. Риллинг, Применение динамической нарезки при отладке программ.
  2. Г. Потье, Э. Тантер, Дж. Пикер, Масштабируемая всеведущая отладка.
  3. П. Фрицсон, Обобщенная алгоритмическая отладка и тестирование.
  4. Дж. Гонслез, Д. Инса, Дж. Сильва, Новая гибридная архитектура отладки для eclipse.
  5. Г. Марига, К. Мвити, Подходы к автоматической отладке: обзор литературы.