Шаг 103.
Методика отладки
На этом шаге мы рассмотрим методику отладки ассемблерных программ.
Основной целью отладчика Turbo Debugger является отладка программы, имеющей отладочную информацию.
Дело в том, что, хотя отладчик и дизассемблирует программу и мы можем видеть дизассемблированный код в окне CPU,
такие дизассемблеры, как W32Dasm и IDA Pro, намного превосходят в этой части Turbo Debugger.
Тем не менее, отладчик Turbo Debugger занимает свою нишу в многообразии отладочных средств, поскольку
он позволяет выполнять отладку на уровне исходных текстов. В этом он незаменим и очень удобен. На этом шаге мы
намерены рассмотреть некоторые вопросы методики отладки.
Вообще процесс отладки можно разделить на четыре этапа.
- Обнаружение ошибки. Обнаружение ошибок в программе связано с тестированием программы и ее эксплуатацией.
- Локализация ошибки. Данный этап часто оказывается самым трудоемким, и именно здесь может
пригодиться использование отладчика. Профессиональные программисты знают, что в сложных алгоритмах найти
ошибку путем простого анализа текста программы бывает очень сложно. Можно, конечно, выводить промежуточные результаты, но для этого
может понадобиться слишком много таких выводов. Хороший отладчик в этом случае незаменим, поскольку может позволить отслеживать
значение переменных на каждом шаге.
- Определение причины ошибки. Отбрасывая тот случай, когда причиной ошибки является неправильный алгоритм,
рассмотрим типичные ассемблерные ошибки.
- Ошибка в порядке следования операндов. Например, MOV EAX,EBX вместо MOV ЕВХ,ЕАХ.
- При использовании рекурсивных алгоритмов или слишком большой вложенности вызовов процедур может быть исчерпан стек.
- При вызове процедур может быть испорчено содержимое того или иного регистра.
- Неосвобождение стека при выходе из процедуры.
- Неправильное использование условных переходов - JA вместо JNA и т.п.
- Часто при организации циклических алгоритмов программисты ошибаются относительно последних значений переменных.
- Неправильная установка флага направления.
- Ошибка при определении границ переменных и массивов. Эти ошибки часто приводят к тому, что портится содержимое и других переменных.
- Неправильное преобразование из одного типа операнда в другой. Например, после загрузки
MOV AL,BL используется ЕАХ и забывается об обнулении старших байтов регистра ЕАХ.
- Исправление ошибки. Если найденная ошибка проста и очевидна для вас, то исправить ее не составит большого труда.
Кстати, как вы, наверное, уже поняли, Turbo Debugger не позволяет исправлять исполняемые модули. Но случаются и ситуации, когда очевидно,
что данный участок программы (или процедура) выдает ошибочное значение, а на то, чтобы найти ошибку, у вас не
хватает времени - участок достаточно сложен. Иногда неправильное значение выходной информации возникает лишь при редком сочетании
входных параметров. В этом случае может быть применен простой прием: между указанным участком и остальной частью программы
вставляется несколько строк, проверяющих выходную информацию и исправляющих ее, если нужно. Такой прием часто оказывается
незаменим при доработке чужой программы очень большого объема, когда понять логику чужого алгоритма (да еще
содержащего ошибку) бывает просто невозможно.
Более подробную информацию по отладке программ можно взять здесь.
Со следующего шага мы начнем рассматривать работу с дизассемблером W32Dasm.
Предыдущий шаг
Содержание
Следующий шаг