64 битный отладчик

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

Может быть использован с любым ActiveX COM знать среды программирования. EXE доступны из командной строки. При этом, анализируя каждый 64 битный отладчик и сохраненный указатель инструкции, ОС определяет, в каком 64 битной отладчике исполняемого файла находится этот указатель. Вот максимум для системы Windows Server с 2Гб оперативной памяти: Благодаря DEP операционная система гораздо четче разграничивает области памяти, в которых находится код, и становится способной перехватывать попытки выполнения кода, выходящие за эти границы.

Честно говоря, мне не слишком комфортно работать с новой операционной системой, если я еще не покопался в ее внутреннем устройстве. А покопаться "под капотом" я люблю. Так что, когда на сцену вышли разрядные версии Windows XP и Windows Serverя был в полном восторге. Приятная особенность Win64 и процессорной архитектуры x64 заключается в том, что они достаточно сильно отличаются от своих предшественников - как раз настолько, чтобы вызывать интерес, в то же время не требуя основательного переобучения.

Хотя мы, разработчики, предпочитаем считать, будто при 64 битном отладчике на платформу x64 удастся отделаться 64 битный отладчик перекомпиляцией своих программ, реальность такова, что нам все равно придется долго возиться с ними в отладчике. И здесь хорошее понимание новой программно-аппаратной платформы будет важным подспорьем.

В данной статье я поделюсь квинтэссенцией своих знаний в области Win64 и архитектуры x64 - тем минимумом, который необходим опытному Winпрограммисту для перехода на платформу x При этом я исхожу из того, что вам известны базовые концепции Win32 и платформы x86 и вы понимаете, зачем ваш код должен работать в Win Это позволит мне не отвлекаться от основной тематики, 64 битный отладчик.

Системы x64 хороши еще и тем, что они - в отличие от систем на основе процессоров Itanium - позволяют использовать либо Win32, либо Win64 на одном компьютере без серьезных потерь в производительности.

И несмотря на некоторые, весьма туманные различия между реализациями x64 от Intel и AMD xсовместимая версия Windows должна работать с любой из. Вам не понадобятся отдельные сборки Windows для xпроцессоров AMD и Intel.

Основное внимание я уделю трем областям: В любом 64 битном отладчике архитектуры Windows я предпочитаю начинать с рассмотрения адресации и адресного пространства. Хотя разрядный 64 битный отладчик теоретически мог бы адресоваться к 16 экзабайтам памятив настоящее время Win64 поддерживает 16 Тб - значение, которое представлено 44 разрядами. Почему же нельзя задействовать все 64 разряда, чтобы адресоваться к 16 экзабайтам памяти?

По целому ряду причин. Начнем с того, что нынешние процессоры x64 обычно позволяют обращаться лишь к разрядному представлению физической памяти 1 Тб. Сама архитектура но не современное оборудование допускает расширение до 52 разрядов 4 петабайтов. Даже если бы это ограничение было снято, размеры таблиц страниц, необходимых для проецирования такого громадного объема памяти, оказались бы просто гигантскими.

Как и в Win32, адресуемая память делится на области пользовательского режима и режима ядра. Каждому процессу выделяется собственное уникальное пространство размером 8 Тб в нижней части памяти, а код режима ядра размещается в верхних 8 Тб и разделяется всеми процессами. У разных версий разрядной Windows разные ограничения на объемы физической памяти табл. Так же, как и в Win32, размер страницы на платформе x64 равен 4 Кб.

Первые 64 Кб адресного пространства никогда не проецируются на физическую память, поэтому младший допустимый 64 битный отладчик - 0x В отличие от Win32 системные DLL по умолчанию не загружаются по адресу в верхней части адресного пространства пользовательского режима.

Вместо этого они загружаются после 4 Гб, обычно по адресам, близким к 0x7FF Приятная особенность процессоров x64 - поддержка битового флага No Execute, который в Windows используется для реализации аппаратной защиты от выполнения данных как кода Data Execution Protection, DEP.

Существование многих вирусов и "багов" на платформе x86 как раз и обусловлено тем, что процессор может выполнять данные так, будто это байты кода. Переполнение буфера намеренное или случайное может привести к 64 битному отладчику, что процессор будет выполнять содержимое области памяти, где должны храниться данные.

Благодаря DEP операционная система гораздо четче разграничивает области памяти, в которых находится 64 битный отладчик, и становится способной перехватывать попытки выполнения кода, выходящие за эти границы.

Это уменьшает уязвимость Windows перед атаками. Для выявления ошибок компоновщик linker на платформе x64 по умолчанию присваивает адресам загрузки исполняемых файлов первое значение, большее разрядного числа 4 Гб.

Это помогает быстро находить проблемные места в существующем коде после его переноса на Win В частности, если указатель хранится как битное значение например, как DWORDто при работе в Winверсии вашей программы он окажется усеченным и станет недопустимым, тут же вызвав нарушение доступа к памяти access violation. Такой прием резко упрощает отлов ошибок, связанных с указателями. Затронутый мной вопрос указателей и DWORD-значений позволяет плавно перейти к системе типов в Win Какой 64 битный отладчик должен иметь указатель?

И описателей handles наподобие HWND? К счастью, Microsoft, ведя нас по весьма запутанному пути от Win16 к Win32, заодно создала новые модели типов, легко расширяемые и до разрядных. То есть у битного указателя размер 8 64 битных отладчиков, а у int, long, DWORD и HANDLE остался прежний размер - 4 байта. Подробнее о типах я расскажу позже, когда речь пойдет о разработке для Win С точки зрения структуры, он почти во всем идентичен формату PE в Win Лишь некоторые поля вроде ImageBase в заголовке расширены, одно поле удалено и одно изменено так, чтобы оно отражало новый тип процессоров табл.

Помимо 64 битного отладчика PE, изменений не так уж. Больший интерес представляет введение раздела PDATA, так как он высвечивает одно из основных различий между реализациями Win32 и Win На платформе x86 обработка исключений базируется на стеке.

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

Как только возникает исключение, ОС просматривает связанный список блоков в стеке, отыскивая подходящий обработчик. Все детали этого процесса я изложил в своей статье за январь г. В Win64 в версиях для x64 и Itanium применяется табличная обработка исключений. Никакого связанного списка блоков данных try в стеке не создается. Вместо этого каждый исполняемый 64 битный отладчик в Win64 содержит таблицу функций 64 битного отладчика выполнения runtime function table.

В каждой записи этой таблицы хранятся начальный и конечный 64 битного отладчика функции, а также местонахождение большого набора данных о коде, обрабатывающем исключения в данной функции, и структура ее фрейма стека. Детальное содержимое этих структур см. Когда возникает исключение, ОС просматривает обычный стек потока. При этом, анализируя каждый фрейм и сохраненный указатель инструкции, ОС определяет, в каком модуле исполняемого файла находится этот указатель.

Далее ОС ищет в найденном модуле таблицу функций периода выполнения, находит в ней подходящую запись и на основании содержащихся в этой записи данных принимает решения по обработке исключения. В Win64 имеется API-функция RtlAddFunctionTable, позволяющая сообщить ОС о динамически генерируемом 64 битном отладчике. Недостаток табличной обработки исключений в сравнении с xмоделью на основе 64 битного отладчика заключается в том, что поиск записей в таблице функций по адресам кода занимает больше времени, чем простой просмотр связанного списка.

Зато исключаются издержки, связанные с тем, что в xмодели приходится обновлять блок данных try при каждом выполнении функции. Не забывайте, что я даю лишь краткое введение, а не полное описание обработки исключений на платформе x Более глубокий обзор xмодели исключений читайте в онлайновом дневнике Кевина Фрая Kevin Frei по ссылке blogs.

В xсовместимых версиях Windows не появилось слишком уж много новых API-функций - большинство таковых в Win64 добавлено в выпуски Windows для процессоров Itanium. Две наиболее важные API-функции - IsWow64Process и GetNativeSystemInfo - позволяют Winприложениям определять, выполняются ли они в Win64, и, если да, выяснять реальные возможности данной системы.

Если же разрядный процесс обращается к GetSystemInfo, он видит лишь те возможности, которые свойственны обычной разрядной системе. Так, GetSystemInfo способна сообщать о диапазонах адресов лишь разрядных процессов. RtlAddFunctionTable RtlDeleteFunctionTable RtlRestoreContext RtlLookupFunctionEntry RtlInstallFunctionTableCallback.

GetNumaAvailableMemoryNode GetNumaHighestNodeNumber GetNumaNodeProcessorMask GetNumaProcessorNode. Wow64DisableWow64FsRedirection Wow64RevertWow64FsRedirection RegDisableReflectionKey RegEnableReflectionKey. GetLogicalProcessorInformation QueryWorkingSetEx SetThreadStackGuarantee GetSystemFileCacheSize SetSystemFileCacheSize EnumSystemFirmwareTables GetSystemFirmwareTable.

Хотя перспективы работы в полностью разрядной Windows-системе выглядят очень радужно, реалии таковы, что какое-то время вам скорее всего понадобится запускать в ней Winкод.

В связи с этим в xверсиях Windows предусмотрена подсистема WOW64, позволяющая сосуществовать Win и Winпроцессам в одной системе. Однако загрузка вашей разрядной DLL в разрядный 64 битный отладчик или наоборот не поддерживается.

Поверьте мне, это хорошо. И наконец-то можно окончательно распрощаться с устаревшим разрядным 64 битным отладчиком В xверсиях Windows процесс, запускаемый из разрядного исполняемого 64 битного отладчика, например из Explorer. Когда Winпроцесс вызывает какую-то функцию режима ядра скажем, для чтения файлаWOW64 автоматически перехватывает этот вызов и переадресует его эквивалентному xкоду.

Конечно, процессам разных "весовых категорий" и разрядным нужно как-то взаимодействовать между. К счастью, все известные и любимые вами Winмеханизмы межпроцессного взаимодействия работают и в Win64; это относится, в том числе, к разделяемой памяти shared memoryименованным каналам named pipes именованным синхронизирующим объектам.

Не могут же в одном каталоге храниться и разрядные версии системных DLL вроде KERNEL32 или USER32, верно? WOW64 сама заботится об этом и осуществляет избирательное перенаправление в файловой системе. Файловые операции, выполняемые из Winпроцесса, которые в обычных условиях адресовались бы к каталогу System32, перенаправляются в каталог SysWow На внутреннем уровне WOW64 "молча" модифицирует соответствующие запросы так, чтобы они были направлены 64 битному отладчику SysWow Как бы гладко ни выглядело это на бумаге, на самом деле легко запутаться.

Например, в одном из участков своего кода я использовал окно разрядной командной строки. Выполняя команду DIR применительно к Kernel И мне пришлось долго чесать в 64 битном отладчике, пока я не сообразил, что перенаправление в файловой системе работает именно так, как и.

Только сначала почитайте документацию MSDN, чтобы не упустить какие-нибудь детали. WOW64 выполняет перенаправление не только в файловой системе, но и в реестре. Вспомните, что я недавно говорил: Win32 DLL нельзя загрузить в Winпроцесс. А теперь подумайте о COM и о том, как она использует реестр для загрузки DLL-библиотек внутреннего внутрипроцессного сервера in-process server.

Что будет, если разрядное приложение вызовет CoCreateInstance для создания объекта, реализованного в Win32 DLL?

Ведь эту DLL нельзя загрузить, верно? В конечном счете Winприложения получают отличное от xприложений по большей части параллельное представление 64 битного отладчика. Как и следовало ожидать, ОС предоставляет возможность разрядным приложениям считывать реальный разрядный 64 битный отладчик из реестра, указывая новые флаговые значения при вызове RegOpenKey и родственных ей функций.

Последние несколько различий в ОС, близкие и дорогие моему сердцу, касаются данных, локальных для потока. В xверсиях Windows на области памяти, локальные для потоков, в том числе на "последнюю ошибку" и Thread Local Storage GetLastError и TlsGetValue соответственноуказывал 64 битный отладчик FS. В xверсиях Windows регистр FS заменен регистром GS. В остальном все работает почти аналогично.

Хотя в этой статье x64 в основном рассматривается с точки зрения пользовательского режима, не могу не обратить ваше внимание на одно важное изменение в архитектуре 64 битного отладчика ядра. В Windows для x64 появилась новая технология под названием PatchGuard, предназначенная для повышения как безопасности, так и отказоустойчивости. Если в двух словах, то программы или 64 битные отладчики пользовательского режима, изменяющие содержимое ключевых структур данных вроде таблиц syscall и таблицы диспетчеризации прерываний interrupt dispatch table, IDTсоздают дыры в защите и потенциальную угрозу стабильности.

При разработке архитектуры xверсий Windows было решено, что допускать модификацию памяти режима ядра такими недокументированными способами больше. Противодействовать им и призвана технология PatchGuard. Она использует поток режима ядра для мониторинга изменений в критически важных областях памяти режима ядра. Если такое изменение обнаруживается, система останавливается через bugcheck. Итак, если вы хорошо знакомы с архитектурой Win32 и знаете, как писать "родной" для нее код, то при переходе на Win64 вас ждет не так уж много сюрпризов.

Считайте, что по большей части Win64 - просто более просторная среда. Теперь рассмотрим архитектуру самих 64 битных отладчиков x64, так как базовые знания набора команд процессора существенно упрощают разработку особенно отладку.

Первое, что вы заметите в xкоде, сгенерированном компилятором, - насколько он похож на известный и любимый вами xкод. Это вам не код для Intel IA64! Второе, на что вы обратите внимание, - имена регистров слегка отличаются от привычных их гораздо.

Имена регистров общего назначения в процессорах x64 начинаются с буквы R, например RAX, RBX и др. Это развитие старой схемы именования на основе 64 битного отладчика E для битных регистров x В далеком прошлом, уже подернутом дымкой забвения, битный 64 битный отладчик AX стал битным EAX, битный BX - битным EBX и. Таким образом, при переходе с разрядных версий на разрядные префикс E во всех именах регистров теперь заменяется префиксом R скажем, RAX - наследник EAX, RBX продолжает дело EBX, RSI заменяет ESI и.

Кроме того, появилось восемь новых регистров общего назначения R8-R Список основных разрядных регистров общего назначения приведен в табл. Кстати, битный регистр EIP стал 64 битным отладчиком RIP. Конечно, разрядные инструкции по-прежнему должны выполняться, поэтому доступны и все остальные версии регистров EAX, AX, AL, AH и др.

Чтобы гуру программирования графических и научных приложений не почувствовали себя забытыми, в 64 битных отладчиках x64 также есть 16 битных SSE2-регистров с именами от XMM0 до XMM Процессор x64 работает либо в разрядном 64 битном отладчике, либо в унаследованном разрядном.

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

Если вы знакомы со схемами кодирования процессорных операций, то вспомните, что пространство для новых инструкций быстро исчезало и что введение восьми новых регистров - задача не из простых. Один из путей ее решения - исключение некоторых редко применяемых инструкций. Пока что я заметил отсутствие разрядных версий PUSHAD и POPAD, которые соответственно сохраняли все регистры общего назначения в стеке и восстанавливали их из.

Другой способ - полное избавление от сегментов в разрядном режиме. Так что жизнь регистров CS, DS, ES, SS, FS и GS подходит к концу. Но об этом мало кто пожалеет. Теперь, когда 64 битного отладчика стали битными, вероятно, вас интересует, насколько увеличится размер 64 битного отладчика.

Вот, например, распространенная разрядная инструкция:. Здесь "иксы" представляют битный адрес. Станет ли он в разрядном режиме битным и превратится ли таким образом из 5-байтовой инструкции в 9-байтовую? Эта инструкция останется прежней длины. В разрядном режиме битная часть операнда инструкции интерпретируется как смещение данных относительно текущей инструкции. Небольшой пример поможет прояснить сказанное. Вот что представляет собой инструкция для вызова по битному значению указателя, хранящемуся по адресу h в разрядном режиме:.

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

Нельзя просто задать 8-байтовое значение указателя в инструкции. Вместо этого вы должны указать битный относительный адрес участка памяти, в котором хранится реальный битный целевой адрес. То есть предполагается, что битный целевой указатель находится в пределах 2 Гб от использующей его инструкции. Для большинства это не имеет особого значения, но только не для тех, кто динамически генерирует код или модифицирует существующий код в памяти!

Основное преимущество всех xрегистров в 64 битный отладчик, что компиляторы наконец-то могут генерировать код, в котором большая часть параметров передается через регистры, а не стек. Заталкивая параметры в стек, неизбежно приходится обращаться по адресам памяти. А мы уже давно крепко усвоили, что обращение по адресам памяти, отсутствующим в кэше процессора, занимает несоизмеримо больше времени. Такое резкое сокращение числа соглашений - великое благо, в том числе для отладки. Главное, что надо знать о соглашении по 64 битным отладчикам на платформе x64, - оно похоже на xсоглашение fastcall.

В xсоглашении первые четыре целочисленных аргумента слева направо передаются в битных регистрах, предназначенных специально для этой цели:. Остальные целочисленные 64 битные отладчики передаются через стек. Указатель this считается целочисленным аргументом, поэтому он всегда помещается в регистр RCX. Что касается 64 битных отладчиков со значениями с плавающей точкой, то первые четыре из них передаются в регистрах XMM0-XMM3, а последующие - через стек потока.

Хотя аргумент может быть передан в регистре, компилятор все равно резервирует для него место в стеке, уменьшая значение регистра RSP. Как минимум, каждая функция должна резервировать в стеке 32 байта четыре битных значения. Это пространство позволяет легко копировать содержимое переданных в функцию регистров в известный участок стека. От вызываемой функции не требуется сбрасывать в стек входные параметры, переданные через регистры, но резервирование места в стеке при необходимости позволяет это сделать.

Конечно, если передается более четырех целочисленных параметров, в 64 битном отладчике нужно зарезервировать соответствующее дополнительное пространство. Допустим, некая функция передает два целочисленных параметра дочерней функции. Компилятор не только запихнет эти значения в регистры RCX и RDX, но и вычтет 32 байта из регистра RSP указателя стека. Вызываемая функция может обратиться к параметрам через регистры RCX и RDX.

Если же коду этой функции данные регистры понадобятся для какой-то иной цели, он сможет скопировать их содержимое в зарезервированное пространство стека размером 32 байта. Очистка параметров в стеке несколько необычна в xсистемах. С технической точки зрения, за очистку стека отвечает вызвавшая функция, а не вызываемая.

Но, кроме как в прологе и эпилоге, вы редко где увидите изменение регистра RSP. В отличие от компилятора x86, который явно добавляет параметры в стек и удаляет их из него с помощью инструкций PUSH и POP соответственно, компилятор x64 резервирует в стеке пространство, достаточное для вызова функции с самым длинным списком параметров. А потом он снова и снова использует это пространство для задания параметров при вызовах дочерних функций. Иначе говоря, содержимое регистра RSP меняется крайне редко.

Эта закономерность резко отличается от той, которая свойственна xкоду, где значение регистра ESP варьируется по мере добавления параметров в стек их удаления из.

Вновь обратимся к примеру. Возьмем xфункцию, вызывающую три другие функции. Первая из них принимает четыре параметра 0x20 байтоввторая - 12 0x60 байтова третья - восемь 0x40 байтов. В прологе сгенерированный код просто резервирует 0x60 байтов в стеке и копирует в соответствующие участки выделенного пространства значения параметров, так что места хватит и для вызова функции с самым длинным списком параметров.

Хорошее и более глубокое описание соглашения по вызовам на платформе x64 можно найти в комментарии Рэймонда Чена Raymond Chen по ссылке blogs. Я не буду тратить драгоценное место в статье на все детали, а лишь подчеркну несколько важных 64 битных отладчиков. Во-первых, целочисленные параметры с размером менее 64 битов дополняются знаком, а затем все равно передаются через соответствующие регистры если они относятся к первым четырем целочисленным параметрам.

Во-вторых, ни при каких условиях ни один параметр не должен оказаться по такому 64 битному отладчику стека, который не кратен 8 64 битным отладчикам иначе будет нарушено битное выравнивание.

Любые 64 битные отладчики, не равные 1, 2, 4 или 8 байтам в том числе структурыпередаются по ссылке. И наконец, структуры struct и объединения union 64 битным отладчиком 8, 16, 32 или 64 64 битного отладчика передаются так, будто это целые значения того же 64 битного отладчика.

Возвращаемое значение функции помещается в регистр RAX. Исключение делается для арифметических типов с плавающей точкой, которые возвращаются в XMM0.

Между вызовами нужно сохранять содержимое регистров RBX, RBP, RDI, RSI и RR Значения в 64 битных отладчиках RAX, RCX, RDX и R8-R11 можно изменять и удалять. Ранее я упоминал, что ОС просматривает 64 битные отладчики стека в 64 битном отладчике обработки исключений. Если вам когда-нибудь доводилось писать код, "проходящий" по стеку, вы знаете, что из-за произвола в организации фреймов в Win32 такой код весьма нетривиален. В xсистемах ситуация значительно улучшилась. Если некая функция выделяет пространство в 64 битном отладчике, вызывает другие функции, сохраняет значения любых регистров или использует механизм обработки исключений, она должна оперировать строго определенным набором инструкций для генерации стандартных прологов и эпилогов.

Принудительное введение стандарта на создание 64 битного отладчика стека для функции - один из способов, благодаря которым ОС гарантирует теоретическичто стек всегда можно будет просмотреть без особых ухищрений. Помимо стандартизированных прологов, компилятор и компоновщик должны создавать соответствующие записи в таблице функций. Итак, я рассмотрел основные особенности архитектуры, не вдаваясь в детали. Усвоив одни лишь эти основы и зная язык ассемблера на разрядной платформе, вы сможете быстро понять смысл xинструкции в отладчике.

Ну а мастерство, как всегда, придет с опытом. Поэтому здесь я исхожу из того, что вы работаете в Visual Studio и что вы выбрали инструментарий для платформы x64, который по умолчанию не устанавливается. Первый шаг в компиляции программы для x64 - создание конфигурации разрядной сборки. Как 64 битный отладчик Visual Studio, вы прекрасно знаете, что по умолчанию у ваших проектов две конфигурации сборки: Поэтому остается создать еще две конфигурации: Debug и Retail для x В меню Build выберите Configuration Manager.

В диалоговом окне Configuration Manager в раскрывающемся списке Active Solution Platform выберите New рис. После этого вы должны увидеть диалог New Solution Platform.

Создание новой конфигурации сборки. Выберите x64 в качестве новой платформы 64 битный отладчик. Теперь у вас должно быть четыре конфигурации сборки: Win32 Debug, Win32 Retail, x64 Debug и x64 Retail.

Переключаться между ними вы будете через Configuration Manager. Теперь посмотрим, насколько совместим с x64 ваш код. Создайте конфигурацию x64 Debug по умолчанию и соберите проект. Если его код не тривиален, все шансы за то, что вы получите при компиляции ошибки, не встречавшиеся в Winконфигурации. И не потребуются тонны директив условной компиляции. Вероятно, при преобразовании Winкода в xкод больше всего усилий понадобится для того, чтобы сохранить корректность ваших определений 64 битных отладчиков.

Помните, что я говорил о системе типов в Win64? Например, если Windows передает вам HWND, не сохраняйте его в FARPROC просто потому, что это легко и удобно.

Вероятно, наиболее частая и легко устранимая ошибка, которую я встречал при 64 битном отладчике кода, вызвана предположением о том, что значение указателя может быть сохранено или перенесено в разрядном типе вроде int, long или даже DWORD. Но вся штука в том, что указатели в Win32 и Win64 имеют разные размеры, а целочисленные типы остались прежней длины.

Немного практики, использование таких переменных станет вашей второй натурой: Возможны ситуации, где надо точно указывать, сколько именно байтов следует отвести под целый тип. На такие случаи в тех же заголовочных файлах Basetsd. Еще одна проблема, связанная с различиями в размерах типов, относится к форматированию вывода printf и sprintf.

Кроме того, printf и sprintf поддерживают префикс I для типов, размер которых зависит от платформы. Вычистив ошибки, вызванные определениями типов, неподходящими для Win64, вы все равно можете остаться с кодом, который работает только на платформе x Тогда, вероятно, лучше пойти по простейшему пути и написать две версии функции: И здесь вам очень пригодится 64 битный отладчик макросов препроцессора:. Правильное использование макросов препроцессора очень важно для написания корректного кросс-платформенного кода.

Пытаясь применить макрос препроцессора, хорошенько подумайте о 64 битный отладчик, чего вы добиваетесь. Например, действительно ли ваш код специфичен только для процессоров x64? Для себя я принял полезное правило при использовании любого из этих макросов: Для примера возьмем плохо написанный код:. Что будет, если я теперь скомпилирую его для третьей процессорной архитектуры? Сам того не желая, я скомпилирую xкод. Гораздо лучше переделать предыдущий код примерно так:. Но не бойтесь, 64 битные отладчики ассемблера.

Существует разрядный MASM ML EXE доступны из командной строки. Чтобы настроить нужные переменные окружения, достаточно запустить файл VCVARS И вот вы наконец добились чистой компиляции Win и xверсий своего кода.

Остался последний фрагмент головоломки - выполнение и отладка этого кода. Хотя вы скомпилировали свою xверсию на 64 битном отладчике с процессором x64, для отладки в режиме x64 понадобятся средства удаленной отладки, предоставляемые Visual Studio.

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

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

Далее из Visual Studio сконфигурируйте свой 64 битный отладчик на применение удаленной отладки xкода. И для начала откройте окно свойств проекта рис. Убедитесь, что текущей является ваша разрядная конфигурация, и выберите Debugging в разделе Configuration Properties. Ближе к верхней части вы увидите раскрывающийся список Debugger to launch.

Его изначальное значение - Local Windows Debugger. Смените его на Remote Windows Debugger. Под этим списком вы можете задать удаленную команду например, имя программыкоторая должна выполняться в момент начала отладки, а также указать имя удаленного компьютера и тип соединения.

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

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

Одно из преимуществ кодирования с применением Microsoft. NET Framework заключается в том, что универсальный код абстрагируется от большей части нижележащей операционной системы. Более того, формат IL-инструкций независим от конкретной процессорной архитектуры. А значит, теоретически двоичный файл. NET-программы, скомпилированной в Winсистеме, можно запускать без модификации в xсистеме. Но на практике все не так гладко.

После ее установки на свой компьютер с xсистемой я смог запускать те же исполняемые. NET-файлы, что и в предыдущей Winсистеме.

Конечно, нет никакой гарантии, что любая. NET-программа будет одинаково хорошо работать и в Win32, и в x64 без перекомпиляции, но все же мои файлы выполнялись без ошибок. Так, вы могли бы разрешить выполнение вашего управляемого кода только в WOW64 несмотря на наличие разрядной CLR.

В общем, для меня переход на xверсию Windows был сравнительно безболезненным. Как только вы усвоите основные различия а их не так уж и много в архитектурах операционных систем инструментальных средств, вам будет достаточно легко поддерживать единую кодовую базу, способную работать на обеих платформах. Существенную помощь окажет Visual Studio К 64 битному отладчику же чуть ли не каждый день на сайте http: Загрузки Visual Studio Пакеты SDK Пробные версии программ Бесплатное скачивание Ресурсы Office Ресурсы Microsoft SharePoint Server Ресурсы Microsoft SQL Server Express Материалы Windows Server R2 Программы Подписки 64 битным отладчикам Студентам Microsoft Imagine Программа Microsoft Student Partners ISV Стартапам Мероприятия Сообщество Журнал MSDN Форумы Блог Канал Channel 9 Документация API и справочники Центры разработки Примеры кода Более не поддерживаемое содержимое.

Запрошенное содержимое было удалено. Вы будете автоматически перенаправлены через 1 секунду. Технические статьи Архив журнала MSDN Magazine Русская Редакция. Русская Редакция Все, что нужно знать, чтобы начать программировать для разрядных версий Windows. Все, что нужно знать, чтобы начать программировать для разрядных версий Windows. XML, T-SQL и CLR открывают новые перспективы в программировании баз данных.

Анализ охвата кода — гарантия всестороннего тестирования приложения. Новые средства анализа данных, доступные в Analysis Services Bootstrapper в Visual Studio упрощает развертывание приложений. Разработка собственного дизайнера форм. Семь советов по применению статических полей, методов и классов. Вывод данных с помощью собственных средств визуализации для Reporting Services.

Многоликий класс CultureInfo —. NET-приложения станут дружелюбнее к пользователю. Как использовать лучшее. NET Framework — как CLR создает объекты периода выполнения. Разработка и развертывание защищенных Web-приложений для ASP.

Усовершенствования модели защиты CAS. Декларативная модель Windows Workflow Foundation упрощает разработку программного обеспечения. NET для взаимодействия по сети. Вдохните жизнь в свои документы: Разработка высокопроизводительных приложений для Windows Compute Cluster Server.

Эффективные методики управления экземплярами в WCF-приложениях. NET Atlas — долгожданная основа для создания сайтов в стиле AJAX. Компилируйте приложения по-своему с помощью нестандартных заданий Microsoft Build Engine.

Новые средства проектирования шаблонов форм. Новые средства и документация для создания интегрированных настольных приложений. Развертывание распределенных бизнес-процессов с помощью Windows Workflow Foundation и веб-сервисов. Введение в Active Directory Federation Services для разработчиков. Эта документация перемещена в архив и не поддерживается.

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

Операционная система x64 В любом обзоре архитектуры Windows я предпочитаю начинать с рассмотрения адресации и адресного пространства. Ограничения на физическую память в зависимости от процессоров Операционная система разрядные модели разрядные модели Windows XP Professional 4 Гб процессора Гб процессора Windows ServerStandard Edition 4 Гб процессора 32 Гб процессора Windows ServerEnterprise Edition 64 Гб процессоров 1 Тб процессоров Windows ServerDatacenter Edition 64 Гб процессора 1 Тб процессора Так же, как и в Win32, размер страницы на платформе x64 равен 4 Кб.

Изменения в полях заголовков PE-файлов Поле заголовка Изменение Magic 0x20b вместо 0x10b BaseOfData Убрано ImageBase Расширено до 64 битов SizeOfStackReserve Расширено SizeOfStackCommit Расширено SizeOfHeapReserve Расширено SizeOfHeapCommit Расширено Помимо заголовка PE, изменений не так уж. Изменения в полях заголовков PE-файлов Функциональность API-функции Обработка исключений RtlAddFunctionTable RtlDeleteFunctionTable RtlRestoreContext RtlLookupFunctionEntry RtlInstallFunctionTableCallback Реестр RegDeleteKeyEx RegGetValue RegQueryReflectionKey NUMA Non-Uniform Memory Access GetNumaAvailableMemoryNode GetNumaHighestNodeNumber GetNumaNodeProcessorMask GetNumaProcessorNode Перенаправление WOW64 Wow64DisableWow64FsRedirection Wow64RevertWow64FsRedirection RegDisableReflectionKey RegEnableReflectionKey Разное GetLogicalProcessorInformation QueryWorkingSetEx SetThreadStackGuarantee GetSystemFileCacheSize SetSystemFileCacheSize EnumSystemFirmwareTables GetSystemFirmwareTable Хотя перспективы работы в полностью разрядной Windows-системе выглядят очень радужно, реалии таковы, что какое-то время вам скорее всего понадобится запускать в ней Winкод.

Основные сведения об архитектуре x64 Теперь рассмотрим архитектуру самих процессоров x64, так как базовые знания набора команд процессора существенно упрощают разработку особенно отладку. Список основных разрядных регистров общего назначения RAX R8 RBX R9 RCX R10 RDX R11 RSI R12 RDI R13 RSP R14 RBP R15 Кстати, битный регистр EIP стал регистром RIP. Вот, например, распространенная разрядная инструкция: CALL DWORD PTR [XXXXXXXX].

CALL DWORD PTR [h]. Нужно написать код для этой архитектуры endif. Была ли эта страница полезной? Ваше мнение очень важно для. Центры разработки Windows Office Visual Studio Microsoft Azure Дополнительно Обучение Microsoft Virtual Academy Канал Channel 9 Журнал MSDN.

Сообщество Новости Форумы Блоги Codeplex. Свяжитесь с нами Самостоятельно. Программы BizSpark для стартапов Microsoft Imagine for students. Информационный бюллетень Конфиденциальность и файлы cookie Условия использования Товарные знаки.


Все, что нужно знать, чтобы начать программировать для разрядных версий Windows


64 битный отладчик

Вы можете переключаться из одного 64 битного отладчика к другому, приостанавливать, возобновлять и уничтожать потоки или изменять их 64 битный отладчик. В частности, если указатель хранится как битное значение например, как DWORDто при работе в Winверсии вашей программы он окажется усеченным и станет недопустимым, тут же вызвав нарушение доступа к памяти access violation.

В окне Stack, OllyDbg использует эвристику, чтобы распознать 64 битного отладчика возврата и структуру записи. Теперь посмотрим, насколько совместим с x64 ваш код. Загрузки Visual Studio Пакеты SDK Пробные версии программ Бесплатное скачивание Ресурсы Office Ресурсы Microsoft SharePoint Server Ресурсы Microsoft SQL Server Express Материалы Windows Server R2 Программы Подписки администраторам Студентам Microsoft Imagine Программа Microsoft Student Partners ISV Стартапам Мероприятия Сообщество Журнал MSDN Форумы Блог Канал Channel 9 Документация API и справочники Центры разработки Примеры кода Более не поддерживаемое содержимое.

Вот, например, распространенная разрядная инструкция:. Вы можете выполнить программу до следующего возврата или до указанного местоположения, или анимировать выполнение.


Помогите выбрать битный отладчик


Вы можете изменять этот размер по своему желанию, а после закрытия Notmyfault вся занятая этой утилитой память освобождается: В VS и более ранних версиях не поддерживается отладка в смешанном режиме для 64 среды. Последние несколько различий в ОС, близкие и дорогие моему сердцу, касаются данных, локальных для потока.

Вот как это выглядит в системе Windows XP с 2Гб памяти: Полная цепочка доступна в отдельном окне. Страницы Главная страница Карта блога. После того, как вы нашли искомый тег в левой колонке в данном случае это "Leak" , следующим шагом будет нахождение драйвера, использующего этот тег. Анализатор - одна из наиболее значимых частей OllyDbg.

Например, в одном из участков своего кода я использовал окно разрядной командной строки. Это помогает быстро находить проблемные места в существующем коде после его переноса на Win Однако загрузка вашей разрядной DLL в разрядный процесс или наоборот не поддерживается.



4146 :: 4147 :: 4148 :: 4149 :: 4150 :: 4151