Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой (ОС).docx
Скачиваний:
9
Добавлен:
11.06.2015
Размер:
169.11 Кб
Скачать

Отладка

И вот вы наконец добились чистой компиляции Win32- и x64-версий своего кода. Остался последний фрагмент головоломки - выполнение и отладка этого кода. Хотя вы скомпилировали свою x64-версию на компьютере с процессором x64, для отладки в режиме x64 понадобятся средства удаленной отладки, предоставляемые Visual Studio. К счастью, если вы работаете с Visual Studio IDE на 64-разрядной машине, IDE сама позаботится обо всех необходимых операциях. Если по какой-то причине вы не можете использовать удаленную отладку, остается лишь один вариант - взять x64-версию WinDbg.

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

Первый шаг - установка на целевой компьютер 64-разрядной MSVSMON. Обычно это делается с помощью программы RdbgSetup, поставляемой с Visual Studio. После запуска MSVSMON зайдите в меню Tools для настройки соответствующих параметров защиты соединения между вашей 32-разрядной Visual Studio и экземпляром MSVSMON.

Далее из Visual Studio сконфигурируйте свой проект на применение удаленной отладки x64-кода. И для начала откройте окно свойств проекта (рис. 4).

 Рис. 4.Выбор платформы сборки

Убедитесь, что текущей является ваша 64-разрядная конфигурация, и выберите Debugging в разделе Configuration Properties. Ближе к верхней части вы увидите раскрывающийся список Debugger to launch. Его изначальное значение - Local Windows Debugger. Смените его на Remote Windows Debugger. Под этим списком вы можете задать удаленную команду (например, имя программы), которая должна выполняться в момент начала отладки, а также указать имя удаленного компьютера и тип соединения.

Если вы все правильно настроили, можете начинать отладку своего x64-приложения точно так же, как и Win32-программы. О соединении с MSVSMON свидетельствует строка "connected", которая появляется в трассировочном окне этой программы при каждом успешном подключении отладчика. С этого момента большинство операций выполняется так же, как и в хорошо известном вам отладчике Visual Studio. Не забудьте открыть окно регистров, чтобы увидеть все 64-битные регистры, а также заглянуть в окно дизассемблированного кода, чтобы посмотреть на такой знакомый, но все же слегка другой ассемблерный x64-код.

Заметьте, что 64-разрядный минидамп в отличие от 32-разрядного нельзя напрямую загрузить в Visual Studio. Вместо этого нужно использовать Remote Debugging. Кроме того, в настоящий момент Visual Studio 2005 не поддерживает отладку interop-вызовов между управляемым и неуправляемым 64-разрядным кодом.

Заключение Приложения Приложение 1.

#include <windows.h>

// объявление функций

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);

//////////////////////////////////////////////////////////////////////////

// функция вхождений программы WinMain

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

// имя будущего класса

LPCTSTR lpzClass = TEXT("My Window Class!");

// регистрация класса

if (!RegMyWindowClass(hInstance, lpzClass))

return 1;

// вычисление координат центра экрана

RECT screen_rect;

GetWindowRect(GetDesktopWindow(),&screen_rect); // разрешение экрана

int x = screen_rect.right / 2 - 150;

int y = screen_rect.bottom / 2 - 75;

// создание диалогового окна

HWND hWnd = CreateWindow(lpzClass, TEXT("Dialog Window"),

WS_OVERLAPPEDWINDOW | WS_VISIBLE, x, y, 300, 150, NULL, NULL,

hInstance, NULL);

// если окно не создано, описатель будет равен 0

if(!hWnd) return 2;

// цикл сообщений приложения

MSG msg = {0}; // структура сообщения

int iGetOk = 0; // переменная состояния

while ((iGetOk = GetMessage(&msg, NULL, 0, 0 )) != 0) // цикл сообщений

{

if (iGetOk == -1) return 3; // если GetMessage вернул ошибку - выход

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam; // возвращаем код завершения программы

}

//////////////////////////////////////////////////////////////////////////

// функция регистрации класса окон

ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName)

{

WNDCLASS wcWindowClass = {0};

// адрес ф-ции обработки сообщений

wcWindowClass.lpfnWndProc = (WNDPROC)WndProc;

// стиль окна

wcWindowClass.style = CS_HREDRAW|CS_VREDRAW;

// дискриптор экземпляра приложения

wcWindowClass.hInstance = hInst;

// название класса

wcWindowClass.lpszClassName = lpzClassName;

// загрузка курсора

wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);

// загрузка цвета окон

wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;

return RegisterClass(&wcWindowClass); // регистрация класса

}

//////////////////////////////////////////////////////////////////////////

// функция обработки сообщений

LRESULT CALLBACK WndProc(

HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

// выборка и обработка сообщений

switch (message)

{

case WM_LBUTTONUP:

// реакция на сообщение

MessageBox(hWnd, TEXT("Вы кликнули!"), TEXT("событие"), 0);

break;

case WM_DESTROY:

PostQuitMessage(0); // реакция на сообщение

break;

default:

// все сообщения не обработанные Вами обработает сама Windows

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}