Термины «ошибка» и «отладка» широко приписывались адмиралу Грейс Хоппер в 1940-х годах. [1] Когда она работала над компьютером Mark II в Гарвардском университете, ее коллеги обнаружили мотылька, застрявшего в реле и тем самым препятствовавшего работе, после чего она заметила, что они «отлаживали» систему. Однако термин «ошибка» в смысле «техническая ошибка» восходит как минимум к 1878 году и к Томасу Эдисону , который описывает «небольшие недостатки и трудности» машиностроения как «ошибки».
Точно так же термин «отладка», похоже, использовался в аэронавтике до того, как появился мир компьютеров. В интервью Грейс Хоппер отметила, что не она придумала этот термин. [ нужна цитата ] Мотылёк подходил к уже существовавшей терминологии, поэтому его удалось сохранить. В письме Дж. Роберта Оппенгеймера (директора Манхэттенского проекта атомной бомбы времен Второй мировой войны в Лос-Аламосе, штат Нью-Мексико) этот термин использовался в письме доктору Эрнесту Лоуренсу из Калифорнийского университета в Беркли от 27 октября 1944 года [2] относительно набора персонала. дополнительного технического персонала.
В статье Оксфордского словаря английского языка , посвященной «отладке», цитируется термин «отладка», использованный применительно к испытаниям авиационных двигателей в статье 1945 года в Журнале Королевского авиационного общества. В статье в «ВВС» (июнь 1945 г., стр. 50) также говорится об отладке, на этот раз авиационных фотоаппаратов. Ошибка Хоппера была обнаружена 9 сентября 1947 года. Программисты не использовали этот термин до начала 1950-х годов. Основополагающая статья Гилла [3] 1951 года представляет собой самое раннее углубленное обсуждение ошибок программирования, но в ней не используются термины «ошибка» или «отладка». В цифровой библиотеке ACM термин «отладка» впервые используется в трех статьях национальных собраний ACM 1952 года. [4] [5] [6] В двух из трех этот термин заключен в кавычки. К 1963 году термин «отладка» стал достаточно распространенным термином, чтобы его можно было упомянуть вскользь без объяснения причин на первой странице руководства CTSS . [7]
Объем
Поскольку программное обеспечение и электронные системы в целом стали более сложными, различные общие методы отладки расширились за счет большего количества методов обнаружения аномалий, оценки воздействия и планирования исправлений программного обеспечения или полных обновлений системы. Слова «аномалия» и «несоответствие» могут использоваться как более нейтральные термины , чтобы избежать слов «ошибка», «дефект» или «ошибка», где может подразумеваться, что все так называемые ошибки , дефекты или ошибки должно быть исправлено (любой ценой). Вместо этого можно провести оценку воздействия, чтобы определить, будут ли изменения, направленные на устранение аномалии (или несоответствия ), экономически эффективными для системы, или, возможно, запланированный новый выпуск может сделать изменения ненужными. Не все проблемы в системе являются критически важными для безопасности или выполнения миссии . Кроме того, важно избегать ситуаций, когда изменение может в долгосрочной перспективе расстроить пользователей больше, чем жить с известными проблемами (где «лекарство будет хуже, чем болезнь»). Принимая решения о приемлемости некоторых аномалий, можно избежать культуры мандата «нулевых дефектов», когда у людей может возникнуть искушение отрицать существование проблем, чтобы результат выглядел как нулевой дефект . Принимая во внимание побочные вопросы, такие как оценка воздействия затрат и выгод, будут расширены более широкие методы отладки, чтобы определить частоту аномалий (как часто возникают одни и те же «ошибки»), чтобы помочь оценить их влияние на всю систему.
Инструменты
Отладка варьируется по сложности: от исправления простых ошибок до выполнения длительных и утомительных задач по сбору, анализу и планированию обновлений данных. Навыки отладки программиста могут быть основным фактором в способности отладить проблему, но сложность отладки программного обеспечения сильно зависит от сложности системы, а также в некоторой степени зависит от используемого языка(ов) программирования. и доступные инструменты, такие как отладчики . Отладчики — это программные инструменты, которые позволяют программисту контролировать выполнение программы, останавливать ее, перезапускать, устанавливать точки останова и изменять значения в памяти. Термин «отладчик» также может относиться к человеку, выполняющему отладку.
Как правило, языки программирования высокого уровня , такие как Java , упрощают отладку, поскольку у них есть такие функции, как обработка исключений и проверка типов , которые облегчают обнаружение реальных источников ошибочного поведения. В таких языках программирования, как C или ассемблер , ошибки могут вызывать скрытые проблемы, такие как повреждение памяти , и часто бывает трудно понять, где возникла первоначальная проблема. В таких случаях могут потребоваться инструменты отладчика памяти .
В определенных ситуациях программные инструменты общего назначения, специфичные для языка, могут быть очень полезны. Они принимают форму инструментов статического анализа кода . Эти инструменты ищут в исходном коде очень специфический набор известных проблем, некоторые общие, а некоторые редкие, уделяя больше внимания семантике (например, потоку данных), а не синтаксису, как это делают компиляторы и интерпретаторы.
Для разных языков существуют как коммерческие, так и бесплатные инструменты; некоторые утверждают, что способны обнаружить сотни различных проблем. Эти инструменты могут быть чрезвычайно полезны при проверке очень больших деревьев исходного кода, где непрактично выполнять обход кода. Типичным примером обнаруженной проблемы может быть разыменование переменной, которое происходит до того, как переменной будет присвоено значение. Другой пример: некоторые такие инструменты выполняют строгую проверку типов, когда язык этого не требует. Таким образом, они лучше находят вероятные ошибки в синтаксически правильном коде. Но эти инструменты имеют репутацию ложноположительных результатов, когда правильный код помечается как сомнительный. Старая программа Unix lint — ранний пример.
Процесс отладки обычно начинается с определения шагов по воспроизведению проблемы. Это может быть нетривиальная задача, особенно с параллельными процессами и, например, с некоторыми Heisenbugs . Конкретная пользовательская среда и история использования также могут затруднить воспроизведение проблемы.
После воспроизведения ошибки ввод программы, возможно, придется упростить, чтобы облегчить ее отладку. Например, ошибка в компиляторе может привести к сбою при анализе большого исходного файла. Однако после упрощения тестового примера всего нескольких строк из исходного файла может быть достаточно для воспроизведения того же сбоя. Упрощение можно выполнить вручную, используя подход «разделяй и властвуй» , при котором программист пытается удалить некоторые части исходного тестового примера, а затем проверяет, возникает ли проблема по-прежнему. При отладке в графическом интерфейсе программист может попытаться пропустить некоторые действия пользователя из исходного описания проблемы, чтобы проверить, достаточны ли оставшиеся действия для возникновения ошибки.
После того, как тестовый пример достаточно упрощен, программист может использовать инструмент отладчика для проверки состояний программы (значений переменных, а также стека вызовов ) и отслеживания источника проблемы (проблем). Альтернативно можно использовать трассировку . В простых случаях трассировка — это всего лишь несколько операторов печати, которые выводят значения переменных в определенных точках во время выполнения программы. [ нужна цитата ]
Техники
Интерактивная отладка использует инструменты отладчика, которые позволяют обрабатывать выполнение программы шаг за шагом и приостанавливать ее для проверки или изменения ее состояния. Подпрограммы или вызовы функций обычно могут выполняться на полной скорости и снова приостанавливаться после возврата к вызывающей стороне, либо сами по себе, либо в пошаговом режиме, либо в любой комбинации этих параметров. Могут быть установлены уставки, которые позволяют выполнять на полной скорости код, в котором нет подозрений на неисправность, а затем останавливаться в такой точке. Установка уставки сразу после окончания программного цикла — удобный способ оценить повторяющийся код. Обычно доступны точки наблюдения, где выполнение может продолжаться до тех пор, пока не изменится определенная переменная, и точки перехвата, которые приводят к остановке отладчика при определенных типах программных событий, таких как исключения или загрузка общей библиотеки.
Отладка или трассировка печати — это наблюдение (в реальном времени или в записи) операторов трассировки или операторов печати, которые указывают ход выполнения процесса и развитие данных. Трассировку можно выполнять с помощью специализированных инструментов (например, трассировки GDB) или путем вставки операторов трассировки в исходный код. Последний иногда называютотладка printf , из-за использованияprintfв C. Этот вид отладки был включен командой TRON в исходных версиях ориентированного на новичковBASIC. ТРОН расшифровывался как «Trace On». TRON заставил номера строк каждой командной строки BASIC печатать во время работы программы.
Трассировка активности аналогична трассировке (см. выше), но вместо того, чтобы отслеживать выполнение программы по одной инструкции или функции за раз, она отслеживает активность программы на основе общего количества времени, затраченного процессором/ЦП на выполнение определенных сегментов кода. Обычно это представляется как доля времени выполнения программы, затраченная на обработку инструкций в пределах определенных адресов памяти (программы с машинным кодом) или определенных программных модулей (язык высокого уровня или скомпилированные программы). Если обнаруживается, что отлаживаемая программа тратит чрезмерную часть времени своего выполнения в отслеживаемых областях, это может указывать на неправильное распределение процессорного времени, вызванное ошибочной логикой программы, или, по крайней мере, на неэффективное распределение процессорного времени, которое могло бы выиграть от усилий по оптимизации.
Удаленная отладка — это процесс отладки программы, работающей в системе, отличной от отладчика. Чтобы начать удаленную отладку, отладчик подключается к удаленной системе через канал связи, например локальную сеть. Затем отладчик может контролировать выполнение программы в удаленной системе и получать информацию о ее состоянии.
Посмертная отладка — это отладка программы после того, как она уже вышла из строя . Связанные методы часто включают в себя различные методы отслеживания, такие как проверка файлов журналов, вывод стека вызовов при сбое [8] и анализ дампа памяти (или дампа ядра ) сбойного процесса. Дамп процесса может быть получен системой автоматически (например, когда процесс завершился из-за необработанного исключения), либо с помощью инструкции, вставленной программистом, либо вручную интерактивным пользователем.
Алгоритм «волчьего забора»: Эдвард Гаусс описал этот простой, но очень полезный и ныне известный алгоритм в статье 1982 года для Communications of ACM следующим образом: «На Аляске есть один волк; как его найти? Сначала постройте забор посередине. штата, подождите, пока волк завыл, определите, на какой стороне забора он находится. Повторяйте процесс только с этой стороны, пока не дойдете до точки, где вы сможете увидеть волка». [9] Это реализовано, например, в системе контроля версий Git как команда git bisect , которая использует описанный выше алгоритм для определения того, какой коммит вызвал конкретную ошибку.
Отладка с записью и воспроизведением — это метод создания записи выполнения программы (например, с использованием бесплатного инструмента отладки RR Mozilla ; включение обратимой отладки/выполнения), которую можно воспроизводить и отлаживать в интерактивном режиме. Полезно для удаленной отладки и отладки прерывистых, недетерминированных и других трудновоспроизводимых дефектов.
Отладка путешествий во времени — это процесс перемещения во времени через исходный код (например, с помощью Undo LiveRecorder ), чтобы понять, что происходит во время выполнения компьютерной программы; разрешить пользователям взаимодействовать с программой; при желании изменить историю и посмотреть, как отреагирует программа.
Saff Squeeze — метод выделения сбоев в тесте с использованием постепенного встраивания частей неудавшегося теста. [11] [12]
Отслеживание причинно-следственных связей : существуют методы отслеживания цепочек причинно-следственных связей в вычислениях. [13] Эти методы можно адаптировать для конкретных ошибок, таких как разыменование нулевого указателя. [14]
В отличие от среды разработки компьютерного программного обеспечения общего назначения, основной характеристикой встроенных сред является огромное количество различных платформ, доступных разработчикам (архитектуры ЦП, поставщики, операционные системы и их варианты). Встроенные системы по определению не являются конструкциями общего назначения: они обычно разрабатываются для одной задачи (или небольшого круга задач), а платформа выбирается специально для оптимизации этого приложения. Этот факт не только усложняет жизнь разработчикам встраиваемых систем, но также усложняет отладку и тестирование этих систем, поскольку для разных платформ необходимы разные инструменты отладки.
Несмотря на упомянутую выше проблему гетерогенности, некоторые отладчики были разработаны как коммерческие, так и исследовательские прототипы. Примеры коммерческих решений взяты из Green Hills Software , [19] Lauterbach GmbH [20] и MPLAB-ICD от Microchip (для внутрисхемного отладчика). Двумя примерами инструментов-прототипов исследований являются Aveksha [21] и Flocklab. [22] Все они используют функциональность, доступную на недорогих встроенных процессорах, — модуль встроенной отладки (OCDM), сигналы которого предоставляются через стандартный интерфейс JTAG . Они оцениваются на основе того, сколько изменений необходимо внести в приложение, и скорости событий, с которыми они могут справиться.
Помимо типичной задачи выявления ошибок в системе, встроенная отладка системы также направлена на сбор информации о рабочих состояниях системы, которую затем можно использовать для анализа системы: поиска способов повышения ее производительности или оптимизации других важных задач. характеристики (например, энергопотребление, надежность, реакция в реальном времени и т. д.).
Анти-отладка
Антиотладка — это «реализация одного или нескольких методов в компьютерном коде, которые препятствуют попыткам обратного проектирования или отладки целевого процесса». [23] Он активно используется признанными издателями в схемах защиты от копирования , но также используется вредоносным ПО для усложнения его обнаружения и устранения. [24] К методам борьбы с отладкой относятся:
На основе API: проверьте наличие отладчика, используя системную информацию.
На основе исключений: проверьте, не мешают ли исключения
Блоки процессов и потоков: проверьте, были ли манипулированы блоками процессов и потоков.
Измененный код: проверка изменений кода, внесенных отладчиком, обрабатывающим точки останова программного обеспечения.
На основе аппаратного обеспечения и регистров: проверка аппаратных точек останова и регистров ЦП.
Тайминг и задержка: проверьте время, необходимое для выполнения инструкций.
Обнаружение и наказание отладчика [24]
Ранний пример антиотладки существовал в ранних версиях Microsoft Word , который, если был обнаружен отладчик, выдавал сообщение: «Древо зла приносит горькие плоды. Сейчас уничтожается программный диск», после чего это вызывало дискету. диск издает тревожные звуки с целью отпугнуть пользователя от повторной попытки. [25] [26]
^ "InfoWorld, 5 октября 1981 г." 5 октября 1981 года. Архивировано из оригинала 18 сентября 2019 года . Проверено 17 июля 2019 г.
^ «Архивная копия». Архивировано из оригинала 21 ноября 2019 г. Проверено 17 декабря 2019 г.{{cite web}}: CS1 maint: archived copy as title (link)
^ С. Гилл, Диагностика ошибок в программах EDSAC. Архивировано 6 марта 2020 г. в Wayback Machine , Труды Лондонского королевского общества. Серия А, Математические и физические науки, Том. 206, № 1087 (22 мая 1951 г.), стр. 538-554.
^ Роберт В.Д. Кэмпбелл, Эволюция автоматических вычислений. Архивировано 18 сентября 2019 г. в Wayback Machine , Материалы национального собрания ACM 1952 года (Питтсбург), стр. 29-32, 1952.
^ Алекс Орден, Решение систем линейных неравенств на цифровом компьютере, Материалы национального собрания ACM 1952 года (Питтсбург), с. 91-95, 1952.
^ Ховард Б. Демут, Джон Б. Джексон, Эдмунд Кляйн, Н. Метрополис, Уолтер Орведаль, Джеймс Х. Ричардсон, MANIAC doi=10.1145/800259.808982, Протоколы национального собрания ACM 1952 года (Торонто), стр. 13-16
^ Совместимая система разделения времени. Архивировано 27 мая 2012 г. в Wayback Machine , MIT Press, 1963.
^ «Посмертная отладка». Архивировано из оригинала 17 декабря 2019 г. Проверено 17 декабря 2019 г.
^ Целлер, Андреас (2005). Почему программы терпят неудачу: Руководство по систематической отладке . Морган Кауфманн. ISBN1-55860-866-4.
^ «Кент Бек, Бей их высоко, бей их низко: регрессионное тестирование и сжатие Саффа» . Архивировано из оригинала 11 марта 2012 г.
↑ Райнсбергер, JB (28 марта 2022 г.). «Сжатие Саффа». Заклинатель кода . Проверено 28 марта 2022 г.
^ Целлер, Андреас (1 ноября 2002 г.). «Выделение причинно-следственных цепочек из компьютерных программ». Заметки по разработке программного обеспечения ACM SIGSOFT . 27 (6): 1–10. дои : 10.1145/605466.605468. ISSN 0163-5948. S2CID 12098165.
^ Бонд, Майкл Д.; Нетеркот, Николас; Кент, Стивен В.; Гайер, Сэмюэл З.; МакКинли, Кэтрин С. (2007). «Отслеживание плохих яблок». Материалы 22-й ежегодной конференции ACM SIGPLAN по системам и приложениям объектно-ориентированного программирования — OOPSLA '07 . п. 405. дои : 10.1145/1297027.1297057. ISBN9781595937865. S2CID 2832749.
^ «Аппаратный отладчик SuperTrace Probe» . www.ghs.com . Архивировано из оригинала 1 декабря 2017 г. Проверено 25 ноября 2017 г.
^ «Отладчик и инструменты трассировки в реальном времени» . www.lauterbach.com . Архивировано из оригинала 25 января 2022 г. Проверено 5 июня 2020 г.
^ Танкрети, Мэтью; Хоссейн, Мохаммад Саджад; Багчи, Саураб; Рагунатан, Виджай (2011). «Авекша». Материалы 9-й конференции ACM по встраиваемым сетевым сенсорным системам . СенСис '11. Нью-Йорк, штат Нью-Йорк, США: ACM. стр. 288–301. дои : 10.1145/2070942.2070972. ISBN9781450307185. S2CID 14769602.
^ Лим, Роман; Феррари, Федерико; Циммерлинг, Марко; Вальзер, Кристоф; Соммер, Филипп; Бойтель, Январь (2013). «ФлокЛаб». Материалы 12-й международной конференции «Обработка информации в сенсорных сетях ». ИПСН '13. Нью-Йорк, штат Нью-Йорк, США: ACM. стр. 153–166. дои : 10.1145/2461381.2461402. ISBN9781450319591. S2CID 447045.
^ Шилдс, Тайлер (2 декабря 2008 г.). «Серия по борьбе с отладкой - Часть I». Веракод . Архивировано из оригинала 19 октября 2016 г. Проверено 17 марта 2009 г.
^ ab «Защита программного обеспечения посредством антиотладки Майкл Н. Ганьон, Стивен Тейлор, Ануп Гош» (PDF) . Архивировано из оригинала (PDF) 1 октября 2011 г. Проверено 25 октября 2010 г.
^ «Microsoft Word для DOS 1.15» . Архивировано из оригинала 14 мая 2013 г. Проверено 22 июня 2013 г.
дальнейшее чтение
Аганс, Дэвид Дж. (2002). Отладка: девять незаменимых правил для обнаружения даже самых неуловимых проблем с программным и аппаратным обеспечением. АМАКОМ. ISBN 0-8144-7168-4.
Бланден, Билл (2003). Программный экзорцизм: Руководство по отладке и оптимизации устаревшего кода . Пресс. ISBN 1-59059-234-4.
Форд, Энн Р.; Теори, Тоби Дж. (2002). Практическая отладка в C++. Прентис Холл. ISBN 0-13-065394-2.
Греткер, Торстен; Хольтманн, Ульрих; Кединг, Хольгер; Влока, Маркус (2012). Руководство разработчика по отладке, второе издание . Создать пространство. ISBN 978-1-4701-8552-7.
Мецгер, Роберт К. (2003). Отладка мышлением: междисциплинарный подход . Цифровая пресса. ISBN 1-55558-307-5.
Майерс, Гленфорд Дж (2004). Искусство тестирования программного обеспечения. ISBN John Wiley & Sons Inc. 0-471-04328-1.
Роббинс, Джон (2000). Отладка приложений . Майкрософт Пресс. ISBN 0-7356-0886-5.
Теллес, Мэтью А.; Се, Юань (2001). Наука отладки . Группа Кориолиса. ISBN 1-57610-917-8.
Востоков, Дмитрий (2008). Антология анализа дампов памяти, том 1 . OpenTask. ISBN 978-0-9558328-0-2.
Целлер, Андреас (2009). Почему программы терпят неудачу, второе издание: Руководство по систематической отладке . Морган Кауфманн. ISBN 978-0-1237-4515-6.
Пегги Олдрич Кидвелл, В поисках неуловимой компьютерной ошибки, IEEE Annals of the History of Computing, 1998.
Внешние ссылки
В Wikiquote есть цитаты, связанные с отладкой .
В Wikibook Принципы компьютерного программирования есть страница на тему: Отладка.
Шаблоны анализа аварийных дампов — подробные статьи по анализу и поиску ошибок в аварийных дампах.
Изучите основы отладки – как улучшить свои навыки отладки, хорошая статья на IBM DeveloperWorks (архивировано из оригинала 18 февраля 2007 г.).
Отладка на основе плагинов для встраиваемых систем
Тестирование и отладка встроенных систем - о генерации цифрового ввода - результаты опроса о тестировании и отладке встроенных систем, Byte Paradigm (архивировано из оригинала 12 января 2012 г.)