Отладка приложений


         

я создал два дополнительных макроса


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

После нескольких дополнительных тестов была обнаружена другая проблема: в выпускном построении с полными оптимизациями необъяснимо часто наблюдались аварийные остановы. В конце концов, удалось проследить эти аварии и приписать их влиянию оптимизатора на некоторые из функций подключения. Оптимизатор пытался быть полезным, но в результате приносил больше вреда, чем пользы. Я был очень осторожен с использованием регистров в функциях подключения и использовал только ЕАХ или непосредственно память стека. Даже после всех предосторожностей для сохранения регистраторов оказалось, что кодовая последовательность отладочного построения

MOV DWORD PTR [EBP-018h], 00000002h 

MOV DWORD PTR [EBP-014h], 00000002h

преобразовывалась оптимизатором в

PUSH 002h

POP EBX

MOV DWORD PTR [EBP-OlCh], EBX

MOV DWORD PTR [EBP-018h], EBX

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

#pragma optimize("", off)

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

В листинге 12-3 показана заключительная версия DD_FUNCS.H — внутреннего файла заголовка, в котором объявляются все специальные макросы функции подключения. В начальный комментарий включен пример функции подключения, который объясняет, как использован каждый из специальных макросов. Настоятельно советую читателям выполнить пример SimpTest (часть исходного кода) в пошаговом режиме. Удостоверьтесь, что на уровне языка ассемблера наблюдается вызов полной функции, потому что это единственный способ увидеть всю ее работу.


Содержание  Назад  Вперед