Отладка
Часть серии о |
Разработка программного обеспечения |
---|
В инженерии отладка — это процесс поиска основной причины , обходных путей и возможных исправлений ошибок .
Для программного обеспечения тактика отладки может включать интерактивную отладку, потока управления анализ , анализ файлов журналов , мониторинг на уровне приложения или системы , дампы памяти и профилирование . Многие языки программирования и инструменты разработки программного обеспечения также предлагают программы, помогающие в отладке, известные как отладчики .
Этимология
[ редактировать ]Термин «ошибка » в смысле «дефект» появился как минимум в 1878 году, когда Томас Эдисон назвал «небольшие недостатки и трудности» в своих изобретениях «ошибками».
Популярная история 1940-х годов принадлежит адмиралу Грейс Хоппер . [ 1 ] Когда она работала над компьютером Mark II в Гарвардском университете, ее коллеги обнаружили мотылька , застрявшего в реле, что препятствовало работе, и записали в журнале «Первый реальный случай обнаружения ошибки». Хотя это, вероятно , шутка , объединяющая два значения слова «ошибка» (биологическая и дефектная), история указывает на то, что этот термин использовался в компьютерной сфере в то время.
Точно так же термин «отладка» использовался в аэронавтике до того, как он появился в мире компьютеров. В письме Дж. Роберта Оппенгеймера , директора времен Второй мировой войны атомной бомбы Манхэттенского проекта в Лос-Аламосе, этот термин использовался в письме доктору Эрнесту Лоуренсу в Калифорнийском университете в Беркли от 27 октября 1944 года: [ 2 ] относительно набора дополнительного технического персонала. В статье Оксфордского словаря английского языка , посвященной отладке, термин «отладка» используется применительно к испытаниям авиационных двигателей в статье 1945 года в Журнале Королевского авиационного общества. Статья в «ВВС» (июнь 1945 г., стр. 50) посвящена отладке авиационных фотоаппаратов.
Оригинальная статья Гилла [ 3 ] в 1951 году — это самое раннее углубленное обсуждение ошибок программирования, но в нем не используется термин «ошибка» или «отладка» .
В цифровой библиотеке ACM термин «отладка» впервые используется в трех статьях национальных собраний ACM 1952 года. [ 4 ] [ 5 ] [ 6 ] Двое из трех используют этот термин в кавычках.
К 1963 году отладка стала достаточно распространенным термином, чтобы его можно было упомянуть вскользь без объяснения причин на первой странице руководства CTSS . [ 7 ]
Объем
[ редактировать ]Поскольку программное обеспечение и электронные системы в целом стали более сложными, различные общие методы отладки расширились за счет большего количества методов обнаружения аномалий, оценки воздействия и планирования исправлений программного обеспечения или полных обновлений системы. Слова «аномалия» и «несоответствие» могут использоваться как более нейтральные термины , чтобы избежать слов «ошибка», «дефект» или «ошибка», где может подразумеваться, что все так называемые ошибки , дефекты или ошибки должно быть исправлено (любой ценой). Вместо этого оценку воздействия можно провести , чтобы определить, будут ли изменения, направленные на устранение аномалии (или несоответствия ), экономически эффективными для системы, или, возможно, запланированный новый выпуск может сделать изменения ненужными. Не все проблемы являются критически важными для безопасности или выполнения миссии в системе . Кроме того, важно избегать ситуаций, когда изменение может в долгосрочной перспективе расстроить пользователей больше, чем жить с известными проблемами (где «лекарство будет хуже, чем болезнь»). Принимая решения о приемлемости некоторых аномалий, можно избежать культуры мандата «нулевых дефектов», когда у людей может возникнуть искушение отрицать существование проблем, чтобы результат выглядел как нулевой. дефекты . Принимая во внимание побочные вопросы, такие как оценка воздействия затрат и выгод, будут расширяться более широкие методы отладки, позволяющие определять частоту аномалий (как часто возникают одни и те же «ошибки»), чтобы помочь оценить их влияние на систему в целом.
Инструменты
[ редактировать ]Отладка варьируется по сложности: от исправления простых ошибок до выполнения длительных и утомительных задач по сбору, анализу и планированию обновлений данных. Навыки отладки программиста могут быть основным фактором в способности отладить проблему, но сложность отладки программного обеспечения сильно зависит от сложности системы, а также в некоторой степени зависит от программирования используемого языка(ов) . и доступные инструменты, такие как отладчики . Отладчики — это программные инструменты, которые позволяют программисту контролировать выполнение программы, останавливать ее, перезапускать, устанавливать точки останова и изменять значения в памяти. Термин «отладчик» также может относиться к человеку, выполняющему отладку.
Как правило, языки программирования высокого уровня , такие как Java , упрощают отладку, поскольку у них есть такие функции, как обработка исключений и проверка типов , которые облегчают обнаружение реальных источников ошибочного поведения. В таких языках программирования, как C или ассемблер , ошибки могут вызывать скрытые проблемы, такие как повреждение памяти , и часто бывает трудно понять, где возникла первоначальная проблема. В таких случаях отладчика памяти могут потребоваться инструменты .
В определенных ситуациях программные инструменты общего назначения, специфичные для языка, могут быть очень полезны. Они принимают форму инструментов статического анализа кода . Эти инструменты ищут в исходном коде очень специфический набор известных проблем, некоторые общие, а некоторые редкие, уделяя больше внимания семантике (например, потоку данных), а не синтаксису, как это делают компиляторы и интерпретаторы.
Для разных языков существуют как коммерческие, так и бесплатные инструменты; некоторые утверждают, что способны обнаружить сотни различных проблем. Эти инструменты могут быть чрезвычайно полезны при проверке очень больших деревьев исходного кода, где непрактично выполнять обход кода. Типичным примером обнаруженной проблемы может быть разыменование переменной, которое происходит до того, как переменной будет присвоено значение. Другой пример: некоторые такие инструменты выполняют строгую проверку типов, когда язык этого не требует. Таким образом, они лучше находят вероятные ошибки в синтаксически правильном коде. Но эти инструменты имеют репутацию ложноположительных результатов, когда правильный код помечается как сомнительный. Старая программа Unix lint — ранний пример.
Для отладки электронного оборудования (например, компьютерного оборудования ), а также низкоуровневого программного обеспечения (например, BIOS , драйверов устройств ) и встроенного ПО такие инструменты, как осциллографы , логические анализаторы или внутрисхемные эмуляторы часто используются (ICE), по отдельности или в сочетании. ICE может выполнять многие типичные задачи отладчика программного обеспечения для низкоуровневого программного обеспечения и встроенного ПО .
Процесс отладки
[ редактировать ]Процесс отладки обычно начинается с определения шагов по воспроизведению проблемы. Это может быть нетривиальная задача, особенно с параллельными процессами и, с некоторыми Heisenbugs например, . Конкретная пользовательская среда и история использования также могут затруднить воспроизведение проблемы.
После воспроизведения ошибки ввод программы, возможно, придется упростить, чтобы облегчить ее отладку. Например, ошибка в компиляторе может привести к сбою при анализе большого исходного файла. Однако после упрощения тестового примера всего нескольких строк из исходного файла может быть достаточно для воспроизведения того же сбоя. Упрощение можно выполнить вручную, используя подход «разделяй и властвуй» , при котором программист пытается удалить некоторые части исходного тестового примера, а затем проверяет, возникает ли проблема по-прежнему. При отладке в графическом интерфейсе программист может попытаться пропустить некоторые действия пользователя из исходного описания проблемы, чтобы проверить, достаточны ли оставшиеся действия для возникновения ошибки.
После того, как тестовый пример достаточно упрощен, программист может использовать инструмент отладчика для проверки состояний программы (значений переменных, а также стека вызовов ) и отслеживания источника проблемы (проблем). Альтернативно трассировку можно использовать . В простых случаях трассировка — это всего лишь несколько операторов печати, которые выводят значения переменных в определенных точках во время выполнения программы. [ нужна ссылка ]
Техники
[ редактировать ]- Интерактивная отладка использует инструменты отладчика, которые позволяют обрабатывать выполнение программы шаг за шагом и приостанавливать ее для проверки или изменения ее состояния. Подпрограммы или вызовы функций обычно могут выполняться на полной скорости и снова приостанавливаться после возврата к вызывающему объекту, либо сами по себе, либо в пошаговом режиме, либо в любой комбинации этих параметров. Могут быть установлены уставки, которые позволяют выполнять на полной скорости код, в котором нет подозрений на неисправность, а затем останавливаться в такой точке. Установка заданного значения сразу после окончания программного цикла — удобный способ оценить повторяющийся код. Обычно доступны точки наблюдения, где выполнение может продолжаться до тех пор, пока не изменится определенная переменная, и точки перехвата, которые приводят к остановке отладчика при определенных типах программных событий, таких как исключения или загрузка общей библиотеки.
- Отладка или трассировка печати — это наблюдение (в реальном времени или в записи) операторов трассировки или операторов печати, которые указывают ход выполнения процесса и развитие данных. Трассировка может выполняться с помощью специализированных инструментов (например, трассировки GDB) или путем вставки операторов трассировки в исходный код. Последний иногда называют отладка printf , из-за использования функции printf в C. Этот вид отладки включался командой TRON в исходных версиях ориентированного на новичков языка программирования BASIC . ТРОН расшифровывался как «Trace On». TRON заставил номера строк каждой командной строки BASIC печатать во время работы программы.
- Трассировка активности аналогична трассировке (см. выше), но вместо того, чтобы отслеживать выполнение программы по одной инструкции или функции за раз, она отслеживает активность программы на основе общего количества времени, затраченного процессором/ЦП на выполнение определенных сегментов кода. Обычно это представляется как доля времени выполнения программы, затраченная на обработку инструкций в пределах определенных адресов памяти (программы с машинным кодом) или определенных программных модулей (язык высокого уровня или скомпилированные программы). Если показано, что отлаживаемая программа тратит чрезмерную часть времени своего выполнения в отслеживаемых областях, это может указывать на неправильное распределение процессорного времени, вызванное ошибочной логикой программы, или, по крайней мере, на неэффективное распределение процессорного времени, которое можно было бы выиграть от усилий по оптимизации.
- Удаленная отладка — это процесс отладки программы, работающей в системе, отличной от отладчика. Чтобы начать удаленную отладку, отладчик подключается к удаленной системе через канал связи, например локальную сеть. Затем отладчик может контролировать выполнение программы в удаленной системе и получать информацию о ее состоянии.
- Посмертная отладка — это отладка программы после того, как она уже вышла из строя . Связанные методы часто включают в себя различные методы отслеживания, такие как проверка файлов журналов, вывод стека вызовов при сбое, [ 8 ] и анализ дампа памяти (или дампа ядра ) разбившегося процесса. Дамп процесса может быть получен системой автоматически (например, когда процесс завершился из-за необработанного исключения), либо с помощью инструкции, вставленной программистом, либо вручную интерактивным пользователем.
- Алгоритм «волчьего забора»: Эдвард Гаусс описал этот простой, но очень полезный и ныне известный алгоритм в статье 1982 года для Communications of ACM следующим образом: «На Аляске есть один волк; как его найти? Сначала постройте забор посередине. штата, дождитесь, пока волк завыл, и определите, на какой стороне забора он находится. Повторяйте процедуру только с этой стороны, пока не дойдете до точки, где вы сможете увидеть волка». [ 9 ] Это реализовано, например, в Git системе контроля версий как команда git bisect , которая использует описанный выше алгоритм для определения того, какой коммит вызвал конкретную ошибку.
- Отладка с записью и воспроизведением — это метод создания записи выполнения программы (например, с использованием бесплатного инструмента отладки RR Mozilla ; включение обратимой отладки/выполнения), которую можно воспроизводить и отлаживать в интерактивном режиме. Полезно для удаленной отладки и отладки прерывистых, недетерминированных и других трудновоспроизводимых дефектов.
- Отладка путешествий во времени — это процесс перемещения во времени через исходный код (например, с помощью Undo LiveRecorder ), чтобы понять, что происходит во время выполнения компьютерной программы; разрешить пользователям взаимодействовать с программой; при желании изменить историю и посмотреть, как отреагирует программа.
- Дельта-отладка — метод автоматизации упрощения тестовых примеров. [ 10 ] : стр.123
- Saff Squeeze — метод выделения сбоев в тесте с использованием постепенного встраивания частей неудавшегося теста. [ 11 ] [ 12 ]
- Отслеживание причинно-следственных связей : существуют методы отслеживания цепочек причинно-следственных связей в вычислениях. [ 13 ] Эти методы можно адаптировать для конкретных ошибок, таких как разыменование нулевого указателя. [ 14 ]
Автоматическое исправление ошибок
[ редактировать ]Отладка встроенных систем
[ редактировать ]В отличие от среды разработки компьютерного программного обеспечения общего назначения, основной характеристикой встроенных сред является огромное количество различных платформ, доступных разработчикам (архитектуры ЦП, поставщиков, операционных систем и их вариантов). Встроенные системы по определению не являются конструкциями общего назначения: они обычно разрабатываются для одной задачи (или небольшого круга задач), а платформа выбирается специально для оптимизации этого приложения. Этот факт не только усложняет жизнь разработчикам встраиваемых систем, но также усложняет отладку и тестирование этих систем, поскольку для разных платформ необходимы разные инструменты отладки.
Несмотря на упомянутую выше проблему гетерогенности, некоторые отладчики были разработаны как коммерческие, так и исследовательские прототипы. Примеры коммерческих решений взяты из Green Hills Software . [ 19 ] Лаутербах ГмбХ [ 20 ] и MPLAB-ICD от Microchip (для внутрисхемного отладчика). Двумя примерами инструментов-прототипов исследований являются Aveksha. [ 21 ] и Флоклаб. [ 22 ] Все они используют функциональность, доступную на недорогих встроенных процессорах, — модуль встроенной отладки (OCDM), сигналы которого передаются через стандартный интерфейс JTAG . Они оцениваются на основе того, сколько изменений необходимо внести в приложение, и скорости событий, с которыми они могут справиться.
Помимо типичной задачи выявления ошибок в системе, встроенная отладка системы также направлена на сбор информации о рабочих состояниях системы, которую затем можно использовать для анализа системы: поиска способов повышения ее производительности или оптимизации других важных задач. характеристики (например, энергопотребление, надежность, реакция в реальном времени и т. д.).
Анти-отладка
[ редактировать ]Антиотладка — это «реализация одного или нескольких методов в компьютерном коде, которые препятствуют попыткам обратного проектирования или отладки целевого процесса». [ 23 ] Он активно используется признанными издателями в схемах защиты от копирования , но также используется вредоносным ПО для усложнения его обнаружения и устранения. [ 24 ] Методы, используемые в борьбе с отладкой, включают:
- На основе API: проверьте наличие отладчика, используя системную информацию.
- На основе исключений: проверьте, не мешают ли исключения
- Блоки процессов и потоков: проверьте, были ли манипулированы блоками процессов и потоков.
- Измененный код: проверка изменений кода, внесенных отладчиком, обрабатывающим точки останова программного обеспечения.
- На основе аппаратного обеспечения и регистров: проверка аппаратных точек останова и регистров ЦП.
- Тайминг и задержка: проверьте время, необходимое для выполнения инструкций.
- Обнаружение и наказание отладчика [ 24 ]
Ранний пример антиотладки существовал в ранних версиях Microsoft Word , который, если был обнаружен отладчик, выдавал сообщение: «Древо зла приносит горькие плоды. Сейчас уничтожается программный диск.», после чего это вызывало дискету. диск издает тревожные звуки с целью отпугнуть пользователя от повторной попытки. [ 25 ] [ 26 ]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «ИнфоУорлд, 5 октября 1981 г.» . 5 октября 1981 года. Архивировано из оригинала 18 сентября 2019 года . Проверено 17 июля 2019 г.
- ^ «Архивная копия» . Архивировано из оригинала 21 ноября 2019 г. Проверено 17 декабря 2019 г.
{{cite web}}
: CS1 maint: архивная копия в заголовке ( ссылка ) - ^ С. Гилл, Диагностика ошибок в программах 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 г.
- ^ Э. Дж. Гаусс (1982). «Методика: алгоритм отладки «волчьего забора»» . Коммуникации АКМ . 25 (11): 780. дои : 10.1145/358690.358695 . S2CID 672811 .
- ^ Целлер, Андреас (2005). Почему программы терпят неудачу: Руководство по систематической отладке . Морган Кауфманн. ISBN 1-55860-866-4 .
- ^ «Кент Бек, Hit'em High, Hit'em Low: регрессионное тестирование и сокращение штата» . Архивировано из оригинала 11 марта 2012 г.
- ^ Райнсбергер, Дж. Б. (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 . ISBN 9781595937865 . S2CID 2832749 .
- ^ Ринар, Мартин К. (2008). «Техническая перспектива Исправление ошибок программы». Коммуникации АКМ . 51 (12): 86. дои : 10.1145/1409360.1409381 . S2CID 28629846 .
- ^ Харман, Марк (2010). «Технологии автоматического исправления». Коммуникации АКМ . 53 (5): 108. дои : 10.1145/1735223.1735248 . S2CID 9729944 .
- ^ Перейти обратно: а б Газзола, Лука; Микуччи, Даниэла; Мариани, Леонардо (2019). «Автоматическое восстановление программного обеспечения: обзор» (PDF) . Транзакции IEEE по разработке программного обеспечения . 45 (1): 34–67. дои : 10.1109/TSE.2017.2755013 . hdl : 10281/184798 . S2CID 57764123 .
- ^ Тан, Шин Хвэй; Ройчоудхури, Абхик (2015). «relifix: автоматическое исправление регрессий программного обеспечения». 2015 IEEE/ACM 37-я Международная конференция IEEE по программной инженерии . IEEE. стр. 471–482. дои : 10.1109/ICSE.2015.65 . ISBN 978-1-4799-1934-5 . S2CID 17125466 .
- ^ «Аппаратный отладчик 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 . ISBN 9781450307185 . S2CID 14769602 .
- ^ Лим, Роман; Феррари, Федерико; Циммерлинг, Марко; Вальзер, Кристоф; Соммер, Филипп; Бойтель, Январь (2013). «ФлокЛаб». Материалы 12-й международной конференции «Обработка информации в сенсорных сетях» . ИПСН '13. Нью-Йорк, штат Нью-Йорк, США: ACM. стр. 153–166. дои : 10.1145/2461381.2461402 . ISBN 9781450319591 . S2CID 447045 .
- ^ Шилдс, Тайлер (2 декабря 2008 г.). «Серия по борьбе с отладкой – Часть I» . Веракод . Архивировано из оригинала 19 октября 2016 г. Проверено 17 марта 2009 г.
- ^ Перейти обратно: а б «Защита программного обеспечения посредством борьбы с отладкой Майкл Н. Ганьон, Стивен Тейлор, Ануп Гош» (PDF) . Архивировано из оригинала (PDF) 1 октября 2011 г. Проверено 25 октября 2010 г.
- ^ Росс Дж. Андерсон (23 марта 2001 г.). Инженерия безопасности . Уайли. п. 684. ИСБН 0-471-38922-6 .
- ^ «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). Искусство тестирования программного обеспечения . John Wiley & Sons Inc. ISBN 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.
Внешние ссылки
[ редактировать ]- Шаблоны анализа аварийных дампов — подробные статьи по анализу и поиску ошибок в аварийных дампах.
- Изучите основы отладки – как улучшить свои навыки отладки, хорошая статья на IBM DeveloperWorks (архивировано из оригинала 18 февраля 2007 г.).
- Отладка на основе плагинов для встраиваемых систем
- Тестирование и отладка встроенных систем - о генерации цифрового ввода - результаты опроса о тестировании и отладке встроенных систем, Byte Paradigm (архивировано из оригинала 12 января 2012 г.)