Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Роббинс Д. - Отладка приложений для Microsoft .NET и Microsoft Windows - 2004

.pdf
Скачиваний:
321
Добавлен:
13.08.2013
Размер:
3.3 Mб
Скачать

ГЛАВА 4 Поддержка отладки ОС и как работают отладчики Win32

191

 

 

использовать регистр фрейма стека в качестве временного регистра, то сделает это. Чтобы облегчить анализ стека в таких ситуациях, компилятор генерирует данные FPO. Данные FPO — это таблица информации, используемой функцией API StackWalk64 для вычисления, как работать с функциями, для которых нормаль ный фрейм стека пропущен. Я хотел коснуться FPO, так как вы случайно можете увидеть ссылки на него в MSDN и в разных отладчиках. Для любопытных: струк туры данных FPO находятся в WINNT.H.

Шаг внутрь, Шаг через и Шаг наружу

Теперь, когда я описал точки прерывания и механизм символов, я хочу объяснить, как отладчики реализуют такую прекрасную функциональность как «Шаг внутрь» (Step Into), «Шаг через» (Step Over) и «Шаг наружу» (Step Out). Я не реализовывал эти функции в WDBG, так как хотел сосредоточиться на центральной части от ладчика. Шаг внутрь, Шаг через и Шаг наружу требуют исходного и дизассембли рованных текстов, позволяющих отслеживать текущую выполняемую строку тек ста или оператор. Познакомившись с этим разделом, вы увидите, что архитекту ра ядра WDBG имеет инфраструктуру, необходимую для реализации этих возмож ностей, а их добавление является в основном упражнением в программировании UI. Функции Шаг внутрь, Шаг через и Шаг наружу работают на базе одноразовых точек прерывания, которые удаляются отладчиком после того, как они сработают.

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

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

Функция Шаг через похожа на Шаг внутрь тем, что отладчик должен найти следующую строку текста в символьном механизме и произвести частичное диз

192 ЧАСТЬ II Производительная отладка

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

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

Обработка команд Шаг внутрь, Шаг через и Шаг наружу кажется простой, но есть одна особенность, которую надо принимать во внимание. Если вы пишете свой отладчик, обрабатывающий Шаг внутрь, Шаг через и Шаг наружу, то что делать, если вы установили одноразовую точку прерывания для одной из этих команд, а там уже установлена обычная точка прерывания? Как разработчик отладчика, вы имеете два варианта действий. Первый: оставить вашу одноразовую точку преры вания «в одиночестве», пока она не сработает. Второй: удалить вашу одноразовую точку прерывания, когда отладчик уведомит вас о срабатывании обычной точ ки прерывания. Последний вариант как раз и есть то, что делает отладчик Visual Studio .NET.

Оба метода корректны, но, удаляя одноразовую точку прерывания для команд Шаг внутрь, Шаг через и Шаг наружу, вы избежите путаницы у пользователя. Если вы разрешите срабатывание одноразовой точки прерывания после обычной, поль зователь может долго удивляться, почему отладчик останавливается в неправиль ном месте.

Итак, вы хотите написать свой собственный отладчик

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

Первым делом после ознакомления с WDBG надо найти прекрасную книгу Джонатана Розенберга «Как работают отладчики» (Jonathan Rosenberg. How Debug gers Work. — Wiley, 1996). Хотя в книге Джонатана нет кода отладчика, это пре красное введение и обсуждение реальных проблем, которые необходимо разре шить при создании отладчика. Очень немногие писали отладчики, поэтому она на самом деле поможет.

Вам будет нужно близко познакомиться с форматом PE файлов и с конкрет ным процессором, на котором вы работаете. Прочитайте наиболее полные ста тьи по формату PE файлов Мэта Питрека (Matt Pietrek) в февральском и мартов ском номерах журнала MSDN Magazine за 2002 год. Вы сможете узнать больше о процессорах из руководств по процессорам Intel (www.intel.com).

ГЛАВА 4 Поддержка отладки ОС и как работают отладчики Win32

193

 

 

Прежде чем взяться за полный отладчик, вам, возможно, стоит написать диз ассемблер. Это не только научит вас обращаться с процессором, но вы также по лучите код, который пригодится для отладчика. Дизассемблер в WDBG являет ся кодом только для чтения. Иначе говоря, только разработчик, написавший его, может его читать. Старайтесь сделать свой дизассемблер гибким и расширяемым. Я достаточно программировал на языке ассемблера в прошлом, но, только напи сав собственный дизассемблер, я стал знать язык ассемблера вдоль и поперек.

Если вы захотите написать собственный дизассемблер, начните со справочных руководств Intel, которые можно загрузить прямо с сервера Intel. Они располага ют всей информацией о командах и их кодах. Кроме того, в конце тома 2 есть полная карта кодов операций, которая вам совершенно необходима для преоб разования чисел в команды. Исходный код нескольких дизассемблеров болтает ся в Интернете. Прежде чем погрузиться в работу, вам, возможно, стоит познако миться с некоторыми из этих дизассемблеров, чтобы узнать, как другие справля ются с проблемами.

Что после WDBG?

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

Пользовательский интерфейс WDBG только достаточен. Первое усовершенство вание — это реализация нового пользовательского интерфейса. Вся информация уже есть, вам нужно только спроектировать лучший способ ее отображения.

WDBG поддерживает только простые точки прерывания по месту. BREAKPOINT.H и BREAKPOINT.CPP готовы для того, чтобы вы добавили интересные виды то чек прерывания, такие как счетчик пропусков точек прерывания (исполнить точку прерывания заданное количество раз, прежде чем она сработает) или точки прерывания с выражениями (останавливаться, только если выражение истинно). Обязательно наследуйте свои новые точки прерывания от CLocationBP, чтобы иметь возможность получить код сериализации и не потребовалось бы ничего менять в WDBG.

Добавьте возможность отсоединяться от процессов при работе под Windows XP/Server 2003 и более поздними версиями ОС.

Совсем просто добавить в WDBG возможность отладки многопроцессных при ложений. Большинство интерфейсов уже настроено для работы со схемой идентификации процессов, поэтому вам потребуется лишь отслеживать про цессы, с которыми вы работаете, при обработке уведомлений отладки.

Интерфейс WDBG уже подготовлен для того, чтобы заглянуть в удаленную отладку и различные процессоры, а UI останется тем же. Напишите DLL уда

194 ЧАСТЬ II Производительная отладка

ленной отладки и расширьте WDBG, чтобы пользователи могли выбирать, где отлаживать: на локальной машине или удаленной.

Вы также могли бы написать дизассемблер получше.

Код SymbolEngine просто передает декодированные символы функции обрат ного вызова, и вам надо задавать объем развертывания при первом вызове EnumLocalVariables. Если хотите подражать чему то вроде окна Watch в Visual Studio .NET, вам нужно развертывать локальные перечисления, чтобы возвра щать большие двоичные объекты для развертывания «на лету». Вам не понадо бится менять что либо во внутреннем устройстве SymbolEngine — только код верхнего уровня в файле SYMBOLENGINE.CPP, управляющий перечислением. Если вы напишете это, возможно, вам захочется расширить SUPERASSERT, чтобы вы смогли развертывать символы «на лету».

В данный момент SymbolEngine нацелен на развертывании локальных пере менных на основе области видимости контекста. Посмотрите, как делается развертывание в SymbolEngine, чтобы также разрешить перечисление глобаль ных переменных. Работа почти сделана — вы должны лишь написать метод, который делает все, что делает EnumLocalVariables, кроме вызова SymSetContext со стеком, равным NULL.

Резюме

Эта глава дала вам общее представление о том, что и как делают отладчики. Было представлено ядро отладочного API Win32 и некоторые вспомогательные систе мы, используемые отладчиками, например, сервер символов. Вы также познако мились с другими доступными отладчиками, кроме отладчика Visual Studio .NET. Наконец, представлен отладчик WDBG — пример полногофункционального от ладчика, иллюстрирующего, как именно работают отладчики.

Если вы никогда ранее не видели, как на этом уровне работают отладчики, вы могли думать, что это чудеса программирования. Однако, посколку вы видели код WDBG, думаю, вы согласитесь, что отладчики делают ту же самую грязную рабо ту, которой занимаются и прочие программы. Сначала самой большой проблемой при написании отладчика Win32, которую надо было преодолеть, был поиск спо соба управления локальными переменными, параметрами и типами. К счастью, благодаря серверу символов DBGHELP.DLL (а также библиотеке SymbolEngine), мы теперь располагаем прекрасным ресурсом для написания отладчиков или инте ресного диагностического кода, невозможного ранее.

Г Л А В А

5

Эффективное использование отладчика Visual Studio .NET

Сколько диагностического кода ни используй и как тщательно ни планируй, порой приходится применять отладчик. Как я уже много раз говорил, ключевой момент

вотладке — стараться обходиться без него, так как он расходует ваше время. Сей час я знаю: большинство из вас использует отладчик для исправления ошибок своих коллег, а не собственных (ваш код, конечно, совершенен). Просто я хочу убедить вас, что если вам нужен отладчик, то вы можете сделать большую часть работы без него и исправить ошибки максимально быстро. Это значит, что вы захотите делать большую часть работы без отладчика, что позволит вам находить и исправ лять ошибки максимально быстро. В этой главе я расскажу, как задействовать пре имущества прекрасного отладчика Microsoft Visual Studio .NET. Если вы, как и я, давно занимаетесь разработкой для платформ Microsoft, вы видите явный прогресс

вразвитии отладчика. На мой взгляд, теперь Visual Studio .NET стала настоящим средством отладки: Windows программисты теперь имеют один отладчик для сценариев, Microsoft Active Server Pages (ASP), Microsoft ASP.NET, .NET, Web сер висов XML, неуправляемого кода и отладки SQL в «одном флаконе», и это восхи тительно.

Это первая из трех глав, посвященных отладчику Visual Studio .NET. В ней я освещу общие возможности отладки .NET и неуправляемого кода, так как между этими средами много общего. Эти возможности, включая расширенное исполь зование точек прерывания, помогут вам в решении проблем кодирования. Я так же дам массу рекомендаций, позволяющих сократить время, проводимое в отлад чике. В главе 6 я освещу специфические детали разработки для .NET. В главе 7 мы

196 ЧАСТЬ II Производительная отладка

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

Если вы впервые сталкиваетесь с отладчиком Visual Studio .NET, советую озна комиться с документацией, прежде чем продолжить чтение книги. Я не буду ка саться основ отладки, полагая, что при необходимости вы обратитесь к докумен тации. Отладчик обсуждается в документации Visual Studio .NET в разделе Visual Studio .NET\Developing with Visual Studio .NET\Building, Debugging, and Testing или в MSDN Online в разделе Visual Studio .NET\Developing with Visual Studio .NET\Buil ding, Debugging, and Testing (http://msdn.microsoft.com/library/en us/vsintro7/html/ vxoriBuildingDebuggingandTesting.asp).

И еще: если вы не прочитали о сервере символов и не настроили его (см. гла ву 2), вы теряете одну из лучших способностей Visual Studio .NET. Независимо от того, что вы разрабатываете — приложение .NET или неуправляемый код, авто матическая загрузка нужных символов означает, что вы всегда готовы к отладке.

Расширенные точки прерывания

В отладчике Visual Studio .NET просто установить точку прерывания на строке исходного кода, выбрав меню Debug или настроив проект. Просто загрузите ис ходный файл, поместите указатель на нужную строку и нажмите стандартную клавишу точки прерывания F9. Или же можно щелкнуть левое поле этой строки. Хотя народ, пришедший из Microsoft Visual Basic 6, может и не считать установку точки прерывания на полях выдающимся достижением (в Visual Basic давно мож но было так делать), программисты C# и C++ увидят в этом замечательное усо вершенствование. Установка точки прерывания таким способом называется уста новкой точки прерывания по месту. Выход в отладчик происходит при достиже нии первой команды, реализующей оператор, для которого установлена точка прерывания. Простота установки точки прерывания по месту может дать невер ное представление о ее важности: размещение точки прерывания на отдельной строке кода и есть то, что отличает современную отладку от средневековой.

На заре программирования точек прерывания просто не было. Была единствен ная «стратегия» поиска ошибок — запустить программу, пока она не завершится аварийно, а затем продираться через дебри шестнадцатеричных дампов состоя ния памяти. Единственными отладчиками в средневековье отладки были трасси ровочные операторы и вера в Бога. В эпоху ренессанса отладки, наступившую с появлением языков высокого уровня, программисты могли устанавливать точки прерывания, но отлаживать должны были только на уровне языка ассемблера. Языки высокого уровня все еще не были обеспечены средствами просмотра локальных переменных и исходного текста. В процессе эволюции языков в более сложные формы начался век современной отладки, а программисты получили возможность устанавливать точки прерывания на строке исходного кода и видеть свои пере менные на дисплее интерпретированными в точном соответствии с их описани ем в программе. Такие простые точки прерывания по месту — сверхмощное сред ство, и только они, я полагаю, позволяют решить 99,46% проблем отладки.

Как бы прекрасно это ни было, установка точек прерывания по месту может очень быстро надоесть. А если вы установите точку прерывания на строке внут

ГЛАВА 5 Эффективное использование отладчика Visual Studio .NET

197

 

 

ри цикла for, исполняющегося от 1 до 10000, а ошибка проявляется на 10000 й итерации? Вы не только натрете мозоль на указательном пальце, нажимая клави шу, предназначенную для выполнения команды Go (продолжить), но и потратите часы, ожидая наступления итерации, приводящей к ошибке. Не лучше ли было бы как то сказать отладчику, что вы хотите пропустить прерывание в этой точке 9999 раз, прежде чем программа остановится?

К счастью, есть способ: прошу в царство расширенных точек прерывания. В сущности расширенные точки прерывания позволяют вам программировать «ин теллект» точек прерывания, позволяя отладчику управлять рутинными операция ми, связанными с выслеживанием ошибок. Пара условий, которые вы можете до бавить к расширенным точкам прерывания, — это пропуск точки прерывания оп ределенное число раз и прерывание исполнения, если некоторое выражение принимает значение «истина». Возможности расширенных точек прерывания окончательно переместили отладчики прямо в наше время, позволяя делать за минуты то, что раньше требовало часов, используя простые точки прерывания по месту.

Подсказки к точкам прерывания

Прежде чем перейти к расширенным точкам прерывания, я хочу коснуться четы рех вещей, о которых вы, возможно, не догадываетесь. Во первых, при установке расширенных точек прерывания лучше всего предварительно начать отладку в пошаговом режиме. При запуске приложения без отладки отладчик использует IntelliSense для установки точек прерывания. Однако, когда вы начинаете отлад ку, в дополнение к IntelliSense вы получаете в распоряжение актуальную базу дан ных (Program Database, PDB) символов отладки (debugging symbols) программы, помогающую устанавливать ваши точки прерывания. Во всех примерах этой и следующих двух глав я сначала запускал отладчик, а уже потом устанавливал эти точки.

Совет: не делайте окно Breakpoints, отображающее установленные точки пре рывания, пристыкованным (docked). Когда вы устанавливаете точки прерывания, Visual Studio .NET иногда устанавливает их, а вы будете удивляться, почему они не работают. Если окно Breakpoints является одним из основных, вы его легко най дете среди тысяч стыкуемых окон интегрированной среды разработки Visual Studio

.NET (IDE). Не знаю, как вас, но меня при работе в Visual Studio .NET тянет устано вить два 35 дюймовых монитора. Чтобы увидеть окно точек прерывания, нажми те Ctrl+Alt+B при стандартной раскладке клавиатуры. Щелкните правой кнопкой заголовок окна точек прерывания или его вкладку и снимите флажок Dockable в появившемся меню. Вам надо проделать это как в нормальном режиме редакти рования, так и режиме отладки. Сделав однажды окно точек прерывания одним из основных, щелкните и перетащите его вкладку в первую позицию, чтобы его всегда можно было найти.

В окне Breakpoints отображаются значки, показывающие, установлена ли точ ка прерывания (табл. 5 1). Значок Warning (предупреждение) — красный кружок с вопросительным знаком — требует дополнительного объяснения. При нормаль ной отладке вы увидите значок Warning, если установили точку прерывания по

198 ЧАСТЬ II Производительная отладка

месту в исходном тексте, модуль которого еще не был загружен, поэтому такая точка прерывания в сущности еще не разрешена. Для тех, кто пришел из лагеря Microsoft Visual C++ 6: диалоговое окно Additional DLL (дополнительные DLL) ушло в прошлом. Так как я рекомендую, чтобы вы запустили отладку до начала установки расширенных точек прерывания, значок Warning в окне точек прерывания сиг нализирует, что точка прерывания была установлена некорректно.

Табл. 5-1. Коды окна точек прерывания

Значок Состояние

Значение

Enabled (Разрешено)

Нормальная активная точка прерывания.

Disabled (Запрещено)

Точка прерывания игнорируется отладчиком,

 

пока не будет разрешена.

Error (Ошибка)

Точка прерывания не может быть установлена.

Warning (Предупреждение)

Точка прерывания не может быть установлена,

 

так как ее место расположения еще не загру

 

жено. Если отладчик имеет предположение

 

о точке прерывания, то показывает значок

 

предупреждения.

Mapped (Отображенная)

Точка прерывания установлена в ASP коде на

 

странице HTML.

 

 

Точку прерывания можно установить в окне Call Stack (стек вызовов), кроме случая отладки SQL. Это полезно, когда вы пытаетесь остановить рекурсию или при глубоко вложенных стеках. Все, что надо сделать, — это подсветить вызов, на котором вы хотите остановиться, и нажать клавишу F9 или щелкнуть правой кноп кой и выбрать Insert Breakpoint (вставить точку прерывания) из появившегося меню.

Однократные точки прерывания можно установить и командой Run To Cursor (запустить до курсора). Их можно установить в окнах редактирования исходного текста, щелкнув правой кнопкой строку и выбрав из меню команду Run To Cursor (она доступна как при отладке, так и при редактировании), и запустится отладка. При раскладке клавиатуры по умолчанию нажатие Ctrl+F10 приведет к тому же результату. Как и с точками прерывания, щелчок правой кнопкой в волшебном окне Call Stack вызывает контекстное меню, также имеющее команду Run To Cursor. Если вы установили точку прерывания до того, как началось выполнение на строке Run To Cursor, отладчик остановится на той точке прерывания и отменит вашу одно разовую точку прерывания.

В заключение скажу, что в управляемом коде вы можете установить теперь точку прерывания подвыражения (subexpression). Например, если имеется следующее выражение и если при отладке вы щелкнете в этой строке левое поле, красным будет подсвечено только i = 0 , m = 0 или инициализирующая часть выражения. Если вы хотели остановиться на подвыражении итератора (в котором происхо дит увеличение или уменьшение), поместите указатель где то в районе части выражения i++ , m— и нажмите клавишу F9. В следующем выражении вы можете иметь до трех точек прерывания в одной строке. В окне точек прерывания они отличаются, так как каждая помечена номером строки и позицией в ней. В левом поле будет только одна красная точка, обозначающая точку прерывания. Для сня

ГЛАВА 5 Эффективное использование отладчика Visual Studio .NET

199

 

 

тия всех точек прерывания строки одновременно, щелкните красную точку в ле вом поле.

for ( i = 0 , m = 0 ; i < 10 ; i++ , m— )

{

}

Быстрое прерывание на функции

Отправной позицией для любой расширенной точки прерывания является диа логовое окно Breakpoint (точка прерывания), доступное по нажатию Ctrl+B при стандартной раскладке клавиатуры. Это окно имеет двойную функцию: New Break point (новая точка прерывания) и Breakpoint Properties (свойства точки преры вания). Во многих отношениях Breakpoint — это просто внешний интерфейс к системе IntelliSense, весьма полезной при написании кода, но используемой и при установке точек прерывания. IntelliSense можно отключить, чтобы проверить точки прерывания в диалоговом окне Options (настройка), папке Debugging (отладка), на странице свойств General (общие), что может ускорить отладку в смешанном режиме, но я настоятельно советую всегда оставлять установленным флажок Use IntelliSense To Verify Breakpoints (использовать IntelliSense для проверки точек прерывания). Вы также сможете работать с точками прерывания IntelliSense, только если открыт исходный текст вашего проекта.

IntelliSense — мощное средство установки точек прерывания, способное сохра нить вам массу времени. В пылу отладочных боев, зная имя класса и метода, на котором надо прервать исполнение, я могу ввести его прямо в диалоговом окне Breakpoint на вкладке Function (функция) в поле ввода Function. Я заглядывал через плечо бесчисленному числу программистов, знавших имя метода, но тративших по 20 минут на блуждание по всему проекту, открывая файлы только для того, чтобы установить курсор на строку и нажать F9. Такой метод установки точки прерыва ния имеет некоторые ограничения, но они необременительны. Во первых, имя должно вводиться с учетом регистра, если язык программирования чувствителен к регистру (вот где Visual Basic .Net особенно прекрасен!). Во вторых, в неуправ ляемом C++ иногда нельзя установить точку прерывания, если имя метода скры то при определении. Наконец, язык программирования в раскрывающемся спис ке Language (язык) диалогового окна Breakpoint, должен соответствовать языку текста программы.

Много всего может случиться при попытке установить точку прерывания на функцию в диалоговом окне Breakpoint. Чтобы увидеть результаты, откройте один из ваших проектов или проект из числа примеров к этой книге и пытайтесь уста навливать точки прерывания в диалоговом окне Breakpoint в процессе нашего обсуждения.

Первый случай быстрой установки точки прерывания применим, если вы хо тите установить ее на существующий класс и метод. Пусть класс MyThreadClass Visual Basic .NET имеет метод ThreadFunc. При открытии диалогового окна Breakpoint нажатием Ctrl+B все, что нужно сделать, — это ввести mythreadclass.threadfunc (помните: Visual Basic .NET нечувствителен к регистру ввода) и щелкнуть OK. Для

200 ЧАСТЬ II Производительная отладка

Visual Basic .NET, J# и C# вы отделяете имя класса от имени метода точкой. Для неуправляемого C++ вы отделяете имя класса от имени метода специфическим для этого языка двойным двоеточием (::). Интересно, что для управляемого C++ для корректной обработки нужно перед выражением добавить MC::. Для тех же клас са и метода из примера для Visual Basic .NET для управляемого C++ вы должны ввести MC::MyThreadClass::ThreadFunc. На рис. 5 1 изображено заполненное диалоговое окно Breakpoint для примера на Visual Basic .NET. Если в момент установки точки пре рывания вы не находитесь в режиме отладки, точка, обозначающая точку преры вания, появляется на полях, но красной подсветки Public Sub ThreadFunc не будет, так как точка еще не может быть разрешена. После запуска отладки Public Sub ThreadFunc подсвечивается красным цветом. Если программа написана на неуправ ляемом C++, строка кода не подсвечивается. Если вы в режиме отладки, точка прерывания полностью разрешена, на что указывает закрашенная сплошным крас ным цветом точка в окне Breakpoints, а Public Sub ThreadFunc подсвечено красным цветом. В C# и неуправляемом C++ точка прерывания появляется внутри функ ции, но это первая исполняемая строка кода после пролога функции. Кроме того, только красная точка появляется на полях.

Рис. 5 1. Диалоговое окно Breakpoint для быстрой установки точки прерывания на функцию

Если имя класса и метода заданы в диалоговом окне Breakpoint неверно, вы увидите сообщение: «IntelliSense could not find the specified location. Do you still want to set the breakpoint?» («IntelliSense не может найти указанное место. Вы все же хотите установить точку прерывания?»). Если вы принимаете решение устано вить точку прерывания на несуществующем методе и работаете с управляемым кодом, то почти наверняка при отладке в точке прерывания будет содержаться вопросительный знак в окне Breakpoints, так как точка не может быть найдена. Как будет показано в главе 7, где мы будем говорить об отладке неуправляемого кода, у вас все же будет шанс установить точку прерывания корректно.

Соседние файлы в предмете Программирование на C++