Каким образом программа отладчик помогает исследовать поведение программы в процессе ее выполнения

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

Обзор

Отладка программ — чрезвычайно распространенная часть разработки программного обеспечения. До 1980-х годов искусство отладки программ, которым занимался каждый программист, не имело никакой теоретической основы. В начале 1980-х были разработаны систематические и принципиальные подходы к отладке программ.

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

Блок 3 Урок 3 Дебаггер и расширения для отладки

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

Затем он спрашивает программиста о правильности таких вычислений. Программист отвечает «ДА», если результат правильный, или «НЕТ», если результат неправильный. Некоторые алгоритмические отладчики также принимают ответ «Я не знаю», когда программист не может дать ответ (например, потому что вопрос слишком сложный).

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

Истоки, текущие и будущие направления

Алгоритмическая отладка была впервые разработана Эхудом Шапиро во время его докторского исследования в Йельском университете, как это было представлено в его докторской диссертации, выбранной в качестве 1982 Выдающаяся диссертация ACM. Шапиро реализовал метод алгоритмической отладки на Прологе (языке логического программирования общего назначения) для отладки логических программ.

В случае логических программ предполагаемое поведение программы является моделью (набором простых истинных утверждений), а ошибки проявляются как неполнота программы (неспособность доказать истинное утверждение) или некорректность (способность доказать ложное утверждение). Алгоритм идентифицирует ложное утверждение в программе и предоставит контрпример к нему или пропущенное истинное утверждение, что это или его обобщение следует добавить в программу. Также был разработан метод обработки без прерывания. Исследования и разработки в области алгоритмической отладки привели к значительным улучшениям по сравнению с исходными алгоритмами для отладки Prolog и других, а также распространили идеи на другие языковые парадигмы, такие как функциональные языки и объектно-ориентированные языки. Спустя три десятилетия с момента своего появления алгоритмическая отладка по-прежнему является активной областью исследований в области компьютерных наук и, вероятно, останется таковой в течение десятилетий, поскольку панацеи не видно.

Простейший пример использования отладчика в Visual Studio (C#)

Источник: alphapedia.ru

Читайте также:
Ubuntu проверить установлена ли программа

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

При использовании интегрированной среды программирования предоставляется удобный интерфейс, позволяющий легко отлаживать разрабатываемую программу. В настоящее время стандартом де-факто стал интерфейс, похожий на программную оболочку Visual C.

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

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

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

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

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

Способы отладки программ.

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

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

Для отладки программ обычно применяют три способа:

1. Пошаговая отладка программ с заходом в подпрограммы;

2. Пошаговая отладка программ с выполнением подпрограммы как одного оператора;

3. Выполнение программы до точки останова.

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

Если в программе имеются уже отлаженные подпрограммы, то подпрограмму можно рассматривать, как один оператор программы и воспользоваться вторым способом отладки программ.

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

Читайте также:
Как запустить установку программы с ключом

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

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

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

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

Источник: studopedia.ru

21.2. Анализ кода программ

Два основных способа исследования программного кода — это дизассемблирование и отладка.

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

Результатом работы дизассемблера является (как можно догадаться из названия) эквивалентный текст на языке ассемблера. Для осмысления ассемблерного текста аналитик, разумеется, должен быть хорошо знаком с языком ассемблера и с особенностями той среды, в которой должна выполняться дизассемблируемая программа. Дизассемблер является пассивным инструментом — он никак не воздействует на программу. Самым мощным дизассемблером из существующих на сегодняшний день’ можно смело назвать дизассемблер IDA Pro (Interactive DisAssembler), разработанный компанией DataRescue.

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

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

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

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

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

Читайте также:
Как пользоваться программой basic

Правда, стоит отметить, что, например, дизассемблер IDA Pro имеет весьма мощные средства расширения (подключаемые модули и язык сценариев), предоставляя тем самым возможность нейтрализовать все попытки противодействия дизассемблированию и последующему анализу.

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

Отладчики бывают трех основных типов: уровня пользователя, уровня ядра и эмулирующие.

Отладчики пользовательского уровня (User-level Debuggers) имеют практически те же возможности, что и отлаживаемая программа. Они используют Debugging API, входящий в состав операционной системы и с его помощью осуществляют контроль над объектом отладки. Отладчики пользовательского уровня входят в состав многих сред разработки, таких как Visual Studio. Они пригодны для исследования незащищенных программ, но могут быть легко обнаружены.

Отладчики уровня ядра (Kernel-mode Debuggers) встраиваются внутрь операционной системы и имеют гораздо больше возможностей, чем отладчики пользовательского уровня. Из ядра операционной системы можно контролировать многие процессы, не доступные другими способами. Одним из самых мощных и часто используемых отладчиков уровня ядра является Softlce, разработанный в компании NuMega Labs (Compuware Corporation). Но и отладчики уровня ядра почти всегда могут быть обнаружены из программы, не имеющей доступа к ядру. Хотя для Softlce, например, был разработан модуль расширения IceExt, позволяющий, среди прочего, неплохо скрывать наличие отладчика в памяти.

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

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

В современных процессорах с архитектурой х86 реализована команда RDTSC (Read Time-Stamp Counter). Эта команда позволяет получить количество тактов процессора, прошедших с момента включения питания или последнего сброса. Очевидно, что отладчик тоже является программой. Следовательно, когда защищенная программа исследуется отладчиком, изрядная часть тактов процессора расходуется на выполнение его кода. И если программа знает приблизительное количество тактов, необходимое для выполнения определенного фрагмента кода, то, измерив реально затраченное число тактов, легко обнаружить значительное увеличение времени выполнения, затраченного на отладку.

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

Источник: www.rfcmd.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru