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

         

WDBG: реальный отладчик


Мне кажется, лучший способ показать, как работает отладчик — написать его, что и сделано в этом разделе. Хотя WDBG не может заменять отладчик Visual C++, но он, конечно, умеет многое, что полагается уметь отладчику. На рис. 4.2 показан WDBG, отлаживающий программу Microsoft Word. На рисунке Word остановлен в точке прерывания, которую я установил на функции GetProcAddress. Окно Memory, в верхнем правом углу, показывает второй параметр, который Word пересылает данному экземпляру GetProcAddress (строка PhevCreateFilelnfo). Рис. 4.2 демонстрирует большую часть возможностей этого отладчика, включая показ регистров, просмотр стеков вызова и кода дизассемблера, показ загруженных модулей и выполняющихся потоков. Кроме того, WDBG поддерживает точки прерывания, перечисление символов и прерывание приложений для остановки отладчика (эти возможности не видны на рис. 4.2, но станут очевидными при первом же запуске WDBG).

Рис. 4.2. Отладчик WDBG в действии

В целом, WDBG — хороший образец отладчика. Однако, глядя на интерфейс пользователя (UI) в WDBG, можно заметить, что я не потратил много времени на создание интерфейса пользователя. Фактически, все окна в WDBG построены по стандарту многодокументного интерфейса (Multiple-Document Interface — MDI) и относятся к редактируемым элементам управления. Это было сделано умышленно: я сохранил простой интерфейс пользователя, потому что не хотел, чтобы его детали отвлекали вас от сущности кода отладчика. Пользовательский интерфейс WDBG написан с использованием библиотеки классов MFC, поэтому попытки улучшить интерфейс не должны вызвать затруднений.

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


Таблица 4.1. Главные подсистемы WDBG

Подсистема

Описание

WDBG.EXE

Содержит весь Ul-код. Дополнительно он заботится об обработке всех точек прерывания. Большая часть этих действий отладчика запрограммирована в файле WDBGPROJDOC.CPP

LOCALDEBUG.DLL

Реализует цикл отладки. Поскольку я хотел обеспечить повторное использование этого отладочного цикла, код пользователя (в данном случае это WDBG.EXE) передает в цикл отладки С++-класс, производный от класса CDebugBaseUser (который определен в DEBUGINTERFACE.H). Когда происходит какое-нибудь отладочное событие, цикл отладки вызыва- " ется в этот класс. За всю синхронизацию ответственны классы пользователей. Файлы WDBGUSER.H и WDBGUSER.CPP содержат координирующий класс для WDBG.EXE. WDBG.EXE использует простую синхронизацию (типа SendMessage). Другими словами, поток отладки посылает сообщение Ш-потоку и блокируется, пока не произойдет возврат из Ill-потока. Если отладочное событие требует ввода пользователя, поток отладки блокируется после посылки сообщения о событии синхронизации. Как только Ill-поток начинает обработку команды Go, он устанавливает событие синхронизации, и поток отладки снова начинает выполняться

LOCALASSIST.DLL

Этот простой модуль только оболочка API-функций, манипулирующих с памятью подчиненного отладчика и регистрами. Используя интерфейс, определенный в этом модуле, WDBG.EXE и I386CPUHELP.DLL могут немедленно перейти к управлению удаленной отладкой, просто заменив этот модуль на сетевой

I386CPUHELP.DLL

Это вспомогательный модуль для процессора IA32 (Pentium). Хотя этот модуль специфичен для процессоров Pentium, его интерфейс, определенный в CPUHELP.H, не зависит от CPU. Если бы вы захотели пренести WDBG на другой процессор, то это единственный модуль, который пришлось бы заменить. Дизассемблер в этом модуле взят из программы Dr. Watson, которая поставляется в составе Platform SDK. Хотя дизассемблер работает, но он нуждается в обновлении, чтобы поддержать последние варианты CPU Pentium





Содержание раздела