Отладка приложений Windows
До появления такой среды разработки приложений Windows, как Borland C++ версии 2.0, отладка приложений требовала наличия двух мониторов или даже двух компьютеров. На одном мониторе отображался ход выполнения программы, другой использовался для работы приложения.
Начиная с версии 2.0 в системе разработки Borland C++ появился одноэкранный отладчик Turbo Debugger for Windows, значительно упрощающий процесс отладки приложений. Для работы этого отладчика достаточно одного компьютера и одного экрана (хотя наилучшие результаты могут быть достигнуты только с двумя компьютерами).
Самый простой способ отладки приложений Windows тем не менее вообще не требует применения отладчика. Он заключается в том, что вы вставляете в разные места исходного текста приложения вызовы функции MessageBox, с помощью которых прослеживаете ход выполнения программы. Если же вам требуется узнать содержимое каких-либо переменных, это можно сделать с помощью функции wsprintf. Вначале с помощью функции wsprintf вы преобразуете интересующее вас значение в текстовую строку, а затем выводите эту строку функцией MessageBox. В некоторых случаях достаточно ограничиться выдачей звукового сигнала, для чего можно вызвать функцию MessageBeep. Примеры вызова функций MessageBox, wsprintf и MessageBeep вы можете найти в приложениях, описанных в нашей книге.
Однако для отладки более сложных приложений вы не сможете ограничиться выдачей диагностических сообщений. Тогда, если вы программист, который только начинает создавать приложения для Windows, мы рекомендуем вам воспользоваться одноэкранным отладчиком Turbo Debugger for Windows, который входит в комплект поставки системы разработки Borland C++ for Windows версии 3.1 или Turbo C++ for Windows.
Учтите, что указанный отладчик не работает с видеоадаптером EGA. Поэтому, если у вас установлен такой видеоадаптер, мы рекомендуем заменить его на другой. Лучше всего приобрести видеоадаптер SVGA с ускорителем для Windows, в котором многие графические операции выполняются аппаратно, благодаря чему скорость вывода изображения сильно повышается.
Стоимость такого видеоадаптера может составлять порядка 100 долларов. В крайнем случае на первом этапе вы можете использовать видеоадаптер VGA, однако в этом случае вам не будут доступны режимы с высоким разрешением и с большим количеством цветов.
С помощью отладчика вы сможете выполнить приложение в пошаговом режиме, выполнить обратную трассировку, установить точки прерывания, просмотреть состояние переменных, содержимое стека, файлов данных, изменить значение переменных и сделать многое другое.
Для запуска отладчика из среды разработки выберите из меню "Run" строку "Debugger". Перед этим вы можете задать параметры командной строки для отлаживаемого приложения. Для этого из указанного меню надо выбрать строку "Debugger Arguments...".
После выбора строки "Debugger" на экране появится сообщение о загрузке отладчика, после чего экран переключится в текстовый режим. К сожалению, отладчик Turbo Debugger for Windows, который поставляется в комплекте со средой разработки Borland C++ for Windows версии 3.1, может работать только в текстовом режиме (среда разработки Borland C++ for Windows версии 4.0 содержит, помимо отдельного отладчика Turbo Debugger for Windows, отладчик, который встроен в среду разработки и работает в обычном окне Windows в графическом режиме). Несмотря на это, указанный отладчик не способен работать с видеоконтроллером EGA.
После запуска отладчика вы попадаете в среду, знакомую вам по отладчику Turbo Debugger для MS-DOS. В отладчике Turbo Debugger for Windows используются почти такие же функциональные клавиши и меню, что и в версии для MS-DOS. Из-за недостатка места в книге мы не будем описывать работу с отладчиком Turbo Debugger. Если вы разрабатывали программы для MS-DOS, вы скорее всего уже пользовались этим отладчиком. Поэтому мы ограничимся только несколькими замечаниями, которые относятся к отладке приложений Windows.
Первое замечание касается отладки функций обратного вызова, таких, как функция окна WndProc.
Так как структура стандартного приложения Windows отличается от линейной структуры программы MS-DOS, для отладки функций обратного вызова вам надо установить в них точки останова. В противном случае вы никогда не сможете отладить такие функции - при пошаговом выполнении приложения вы окажетесь в цикле обработки сообщений. Добраться до функций обратного вызова через пошаговое выполнение приложения невозможно, так как эти функции вызываются не из приложения, а из операционной системы Windows.
Если функция окна расположена в отдельном файле, для установки точки останова вам надо перейти в режим просмотра этого файла. Для просмотра модуля, расположенного в отдельном файле, выберите из меню отладчика "View" строку "Module". Вы окажитесь в диалоговой панели, с помощью которой можно выбрать имя модуля. Приложения, приведенные в нашей книге, используют для функции окна файл с именем wndproc.cpp, поэтому в появившейся диалоговой панели выберите строку "WNDPROC".
После этого в окне отладчика вы увидите исходный текст функции окна. Выберите нужное вам место и установите точку останова, нажав клавишу <F2>. Далее запустите приложение на выполнение, нажав клавишу <F9>. Когда будет достигнута установленная вами точка останова, отладчик переключится в пошаговый режим.
Второе замечание относится к просмотру экрана выполняющегося приложения.
Для переключения в режим просмотра экрана приложения и обратно используйте комбинацию клавиш <Alt+F5>. При переключении в верхней части экрана авторы практически всегда наблюдали "мусор". Это не есть результат неправильной работы вашего приложения, поэтому, если можете, не обращайте на него никакого внимания. Возможно, в следующих версиях одноэкранного отладчика Borland сумеет сделать правильное восстановление экрана Windows. Если же подобная "особенность" отладчика вам кажется недопустимой, единственный выход - отладка с помощью двух адаптеров или, что лучше, с помощью двух компьютеров.
Однако для начала вам лучше работать с одноэкранным отладчиком.
Отладчик Turbo Debugger for Windows имеет дополнительные возможности по сравнению с версией для MS-DOS. В частности, с помощью этого отладчика можно протоколировать сообщения, которые получают и посылают окна вашего приложения, работать с глобальной и локальной памятью, просматривать полный список загруженных модулей, отлаживать библиотеки динамической загрузки DLL и просматривать содержимое любого селектора.
Для просмотра списка сообщений, получаемых функцией окна, выберите в отладчике из меню "View" строку "Windows Message". На экране появится диалоговая панель "Windows Message", разделенная на три части. В левой верхней части следует указать имя функции окна или идентификатор окна, для которого нужно протоколировать сообщения. В правой верхней части окна можно выбирать, какие сообщения следует отображать, а какие - игнорировать. Нижняя часть окна предназначена для отображения получаемых сообщений.
Выберите мышью левую верхнюю часть окна "Windows Message" и нажмите комбинацию клавиш <Alt+F10>. На экране появится меню из трех строк:
Add... Remove Delete all
Выберите строку "Add...". На экране появится диалоговая панель "Add window or handle to watch". В этой диалоговой панели установите переключатель "Identify by" в положение "Window proc" и в поле "Window identifier" введите имя функции окна, например wndproc. Затем нажмите кнопку "OK".
С помощью строк "Remove" и "Delete all" вы можете удалить отдельный или все идентификаторы или имена функций, для которых нужно протоколировать получаемые сообщения.
В правой верхней части диалоговой панели "Windows Message" находится надпись "Log all messages", которая означает, что будут протоколироваться все сообщения, поступающие в указанные вами окна. Если сообщений слишком много, вы можете выбрать для отображения только некоторые классы сообщений.
Для этого выберите мышью правую верхнюю часть диалоговой панели "Windows Message" и нажмите комбинацию клавиш <Alt+F10>. Появится уже знакомое вам меню:
Add... Remove Delete all
Выберите строку "Add...". С помощью переключателя "Message class" вы можете выбрать различные классы отображаемых (протоколируемых) сообщений:
Класс сообщения | Описание |
All Messages | Все сообщения |
Mouse | Сообщения от мыши |
Window | Сообщения от системы управления окнами (такие, как WM_PAINT и WM_CREATE) |
Input | Сообщения от клавиатуры, системного меню, полос просмотра или кнопок изменения размера |
System | Системные сообщения |
Initialization | Сообщения, которые появляются при создании приложением окна или диалоговой панели |
Clipboard | Сообщения, которые создаются приложением при доступе к универсальному буферу обмена Clipboard или окну другого приложения |
DDE | Сообщения, которые возникают в результате динамического обмена данными между приложениями с использованием механизма DDE |
Non-client | Сообщения, которые создаются Windows для работы с внешней (non-client) областью окна (такие, как WM_NCHITTEST или WM_NCCREATE) |
Other | Остальные сообщения, не попавшие в перечисленные выше классы, такие, как сообщения интерфейса MDI |
Single Message | Любое выбранное вами сообщение. Символическое имя или десятичный идентификатор сообщения следует указать в поле "Single Message Name" |
Остальные возможности отладчика будут рассмотрены позже.