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

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

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

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

201

 

 

Так как установка точки прерывания путем указания имени класса и метода работает хорошо, я поэкспериментировал, пробуя устанавливать точку прерыва ния в диалоговом окне Breakpoint, просто указывая имя метода. Для C#, J#, Visual Basic .NET и неуправляемого C++, если имя метода уникально в приложении, окно Breakpoint просто устанавливает точку прерывания, будто вы полностью ввели имя класса и метода. Увы, кажется, управляемый C++ не поддерживает установку то чек прерывания простым указанием имени метода.

Так как установка точки прерывания простым указанием имени метода рабо тает очень хорошо и будет экономить ваше время при отладке, вас может удивить то, что случится в большом проекте, когда вам захочется установить точку пре рывания на общий или перегруженный метод. Допустим, имеется открытый про ект WDBG MFC из главы 4, а вам хочется установить точку прерывания на метод OnOK, являющийся методом по умолчанию, который обрабатывает щелчок кнопки OK. Если вы введете OnOK в окне Breakpoint и щелкните OK, случится нечто весьма приятное.

Рис. 5 2. Диалоговое окно Choose Breakpoints (выбор точки прерывания)

То, что вы видите на рис. 5 2, есть список IntelliSense всех классов проекта WDBG, имеющих метод OnOK. Не знаю, как вы, а я полагаю, что это выдающаяся возмож ность, особенно тем, что щелчок кнопки All (все), позволяет установить точки прерывания на всех таких методах одним ударом, и это работает во всех языках, поддерживаемых Visual Studio .NET, кроме управляемого C++! Диалоговое окно Choose Breakpoints также отображает перегруженные методы одного и того же класса. Я не знаю, как часто мне приходилось устанавливать точки прерывания и диалоговое окно Choose Breakpoints напоминало мне, что я должен также при нять решение о прерывании и на других методах.

Другая моя излюбленная штучка в C++ — просто ввести имя класса в окне Breakpoint. И вдруг возникает диалоговое окно Choose Breakpoints, предлагая все методы класса! Как жаль, что эта сногсшибательная функция работает с кодом C++ (а также, что поразительно, с управляемым C++), а с C#, J# и Visual Basic .NET — нет. Но для C++ такая возможность — великое благо. Если вы хотите убедиться, что ваши тестовые примеры охватывают все методы класса, просто введите имя класса в диалоговом окне Breakpoint и щелкните кнопку All в окне Choose Break points. Это сразу установит точки прерывания на все методы, так что вы сможете оценить, все ли методы вызываются вашими тестовыми примерами. Эта возмож ность также замечательна при поиске неработающего кода, так как если устано

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

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

Работая над книгой, я использовал Visual Studio .NET 2003 RC2. При проверке, может ли C# и J# устанавливать точки прерывания класса так же, как это делается

внеуправляемом C++, я наталкивался на жуткую ошибку, аварийно завершавшую Visual Studio .NET. Надеюсь, эта ошибка исправлена в окончательной версии1 ; но если нет, я хочу, чтобы вы знали о ней. В проектах C# и J#, если вы вводите имя класса и точку после него в окне Breakpoint, например Form1., и щелкаете кнопку OK, появится сообщение об ошибке периода исполнения Visual C++, что прило жение попыталось завершиться необычным образом. При щелчке кнопки OK интегрированная среда разработки (IDE) просто исчезнет. Попытка сделать то же самое в приложении на Visual Basic .NET не закрывает IDE. Хоть это и весьма мер зкая ошибка, только некоторые из вас могут нарваться на нее2 .

Япросто поражен, что возможность выбора из множества методов в вашем приложении при установке точки прерывания в отладчике не отмечена большим, жирным знаком, как сногсшибательная функция Visual Studio .NET. На самом деле

вдокументации MSDN имеется лишь мимолетная ссылка на диалоговое окно Choose Breakpoints. Однако я рад сообщить об этом вместо команды разработчиков от ладчика.

Как вы, наверное, догадываетесь, вам теперь нет нужды мучаться с диалоговым окном Choose Breakpoints, если вам известен класс и метод, так как можно про сто напечатать их. Конечно же, нужно использовать соответствующий языку про граммирования разделитель. Если вам нужна полная определенность, можно ука зать типы параметров перегруженного метода в Visual Basic .NET и C++ с учетом семантических требований этих языков. Что интересно, C# и J# не обращают внимания на параметры, и всегда появляется окно Choose Breakpoints, что, пожа луй, является ошибкой.

Если вы хотите быстро установить точку прерывания при отладке, это еще интереснее, особенно с управляемым кодом. О неуправляемом коде мы погово рим в главе 7, так как во время отладки требуется больше ручной работы для ус тановки точек прерывания. Для управляемого кода я заметил одну очень интерес ную возможность в окне Breakpoint. Однажды во время утомительной отладки я ввел имя класса и метода библиотеки классов Microsoft .NET Framework вместо класса и метода из своего проекта, и в окне Breakpoints появилось целая куча за гадочных точек прерывания. Допустим, имеется консольное приложение, вызы вающее Console.WriteLine, а во время отладки вы вводите Console.WriteLine в окне Breakpoint. Вы получаете обычное сообщение, что IntelliSense не знает, что ему делать. Если вы щелкните Yes (да) и попадете в окно Breakpoints, вы увидите не что вроде того, что изображено на рис. 5 3 (необходимо полностью раскрыть все от корня дерева).

Это дочерние точки прерывания. Документация Visual Studio .NET сообщает, что они есть и что это такое. Например, в документации сказано, что дочерние точки прерывания возникают, когда вы устанавливаете точку прерывания на пе

1 В окончательной версии эта ошибка устранена. — Прим. перев.

2 В окончательной версии эта ошибка также устранена. — Прим. перев.

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

203

 

 

регруженных функциях, но окно Breakpoints всегда показывает их как точки пре рывания верхнего уровня. С дочерними точками прерывания вы можете встре титься при отладке нескольких исполняемых кодов и когда две программы за гружают один и тот же элемент управления в свои домены приложения или ад ресные пространства, а вы устанавливаете точки прерывания в одно и то же ме сто элемента управления в обеих программах. Дико то, что окно Breakpoints на рис. 5 3 изображает единственную исполняющуюся сейчас программу, в которой я устанавливаю точку прерывания на Console.WriteLine.

Рис. 5 3. Дочерние точки прерывания в окне Breakpoints

Если щелкнуть правой кнопкой на дочерней точке прерывания и выбрать Go To Disassembly (перейти к дизассемблированному тексту), появляется окно Disassem bly с дизассемблированным кодом. Однако тайну происходящего можно раскрыть, щелкнув правой кнопкой на дочерней точке прерывания и выбрав из меню Proper ties (свойства), а в результирующем диалоговом окне Breakpoint — вкладку Address (адрес) (рис. 5 4). Вы увидите, что отладчик сообщает, что точка прерывания уста новлена на System.Console.WriteLine в самом начале функции.

Если это не совсем понятно, вы всегда можете запустить свою программу и заметить, что остановились в глубоком тумане ассемблера x86. Открыв окно Call Stack, вы увидите, что остановились внутри вызова функции Console.WriteLine и даже видны переданные параметры. Прелесть таких недокументированных средств обработки точек прерываний в том, что вы всегда можете заставить свое прило жение остановиться в заданной точке.

Хотя я сделал лишь один вызов Console.WriteLine в своей программе, окно Break points показывает 19 дочерних точек прерывания (рис. 5 3). Методом проб и ошибок я открыл, что количество дочерних точек прерывания связано с количе ством перегруженных методов. Иначе говоря, установка точки прерывания путем ввода имени класса и метода .NET Framework или ввода при отсутствии исходно го текста приводит к тому, что точка прерывания будет установлена для всех пе регруженных методов. Из документации вы узнаете, что Console.WriteLine имеет только 18 перегруженных методов, но позвольте заметить, что, посмотрев на класс Console.WriteLine с помощью ILDASM, вы увидите, что в действительности имеет ся 19 перегруженных методов.

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

Рис. 5 4. Точка прерывания на любой вызов Console.WriteLine

Способность останавливаться на методе, вызванном откуда угодно из моего домена приложения, — вещь крутая. Я немного познакомился с тем, как взаимо действуют классы .NET Framework, останавливаясь на конкретных методах биб лиотеки классов .NET Framework. Хотя для примера я использовал статический метод, эта технология отлично работает с экземплярными методами и свойства ми, если эти методы и свойства вызываются вашим доменом приложения. Имей те в виду: чтобы правильно устанавливать точки прерывания на свойства, нужно указать их префикс get_ или set_ в зависимости от того, что вы собираетесь пре рывать. Чтобы, скажем, установить точку прерывания на свойство Console.In, надо указать Console.get_In. Кроме того, важен выбор языка программирования в диа логовом окне Breakpoint. При установке таких точек прерывания для всего доме на приложения в местах, где вы не располагаете исходным текстом, мне нравит ся использовать Basic, чтобы даже при ошибке в регистре ввода точка прерыва ния все равно была бы установлена.

Есть две проблемы, о которых вы должны знать при установке таких точек прерывания для домена приложения. Первая: точки прерывания, установленные таким способом, не сохраняются при перезапуске приложения. Рассмотрим при мер, в котором мы добавили при отладке точку прерывания на Console.WriteLine. Окно Breakpoints будет показывать «Console.WriteLine» при перезапуске програм мы, но значок точки прерывания изменится на знак вопроса, а точка прерывания станет ненайденной и никогда не будет установлена. Вторая: вы можете устанав ливать такие точки для всего домена приложения, только если указатель коман ды находится в коде, для которого вы располагаете PDB файлом. Если попробо вать установить точку прерывания в окне Disassembly при отсутствии исходного текста, она установится как ненайденная и никогда не будет активизирована.

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

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

205

 

 

можна установка точек прерывания по месту. На панели инструментов есть поле со списком Find (найти) (рис. 5 5). Если в нем напечатать имя класса и метода и нажать F9, на этом методе, если он существует, будет установлена точка прерыва ния. Если указан перегруженный метод, система автоматически установит точки прерывания на перегруженные методы. Поле со списком Find немного отличает ся тем, что, если точку прерывания нельзя установить, она и не будет установле на. Кроме того, как и окно Breakpoint при работе с проектом C++, указание име ни класса в поле со списком Find и нажатие F9 установит точки прерывания на каждый из методов класса.

Поле со списком Find

Рис. 5 5. Поле со списком Find

Это маленькое поле со списком Find имеет еще два маленьких секрета. При стандартной раскладке клавиатуры, если вы введете имя файла проекта или include файла из переменной окружения INCLUDE и нажмете Ctrl+Shift+G, поле со списком Find откроет этот файл для редактирования. В заключение, если вам нравится окно Command Visual Studio .NET, попробуйте следующее: в поле со списком Find вве дите символ «больше» (>) и наблюдайте превращение этого поля в миниатюрное командное окно со своим собственным IntelliSense. Все эти недокументирован ные чудеса поля со списком Find часто наводят меня на мысль напечатать «Fix my bugs!» (исправь мои ошибки!) и посмотреть, как этот запрос чудесным образом исполняется.

Модификаторы точек прерывания по месту

Теперь, когда вы умеете расставлять точки прерывания налево и направо, я могу вернуться к некоторым сценариям, обсуждавшимся в начальном разделе о точках прерывания. Основная идея — добавить точкам прерывания мозгов для более эффективного использования отладчика. Наиболее выигрышными являются счет чики выполнений (hit counts) и условные выражения.

Счетчики выполнений

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

Добавить счетчик выполнений к точке прерывания по месту очень просто. Во первых, установите обычную точку прерывания по месту на строке или на под выражении строки. Для управляемого кода щелкните правой кнопкой в красной области строки для точки прерывания по месту и выберите Breakpoint Properties (свойства точки прерывания) из появившегося меню. Для неуправляемого кода щелкните правой кнопкой красную точку в левом поле. Кроме того, вы можете

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

выбрать точку прерывания в окне Breakpoints и щелкнуть кнопку Properties или щелкнуть правой кнопкой окно и выбрать Properties. Независимо от того, как вы это делаете, вы попадете в диалоговое окно Breakpoint, где нужно щелкнуть кнопку Hit Count (счетчик выполнений).

В заключительном диалоговом окне Breakpoint Hit Count (счетчик выполне ний точки прерывания) вы увидите, что Microsoft усовершенствовала опции счет чика выполнений по сравнению с предыдущими отладчиками. В раскрывающем ся списке When The Breakpoint Is Hit (когда достигается точка прерывания) надо выбрать один из вариантов реакции (табл. 5 2) и ввести количество выполнений в поле ввода рядом с выпадающим списком.

Табл. 5-2. Варианты работы счетчика выполнений

При достижении

 

счетчика выполнений

Описание

Break always

Останавливать каждый раз, когда исполняется

(всегда прерывать)

это место.

Break when the hit count

Остановить, если произошло заданное количество

is equal to (прервать, если

выполнений. Отсчет выполнений начинается с 1.

счетчик выполнений равен)

 

Break when the hit count is a multiple of (прерывать, если счетчик выполнений кратен)

Break when the hit count is greater than or equal to (прерывать, если счетчик выполнений больше или равен)

Прерывать каждые x исполнений.

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

в предыдущих версиях отладчиков Microsoft.

Счетчики выполнений полезны потому, что при прерывании исполнения от ладчик показывает, сколько раз исполнялась строка программы, где установлена точка прерывания. Если ваша программа валится или происходит разрушение данных внутри цикла, но вам неизвестно, на какой итерации это происходит, добавьте точку прерывания по месту к строке внутри цикла и добавьте модифи катор счетчика прерываний со значением большим, чем количество повторений цикла. При аварийном завершении программы или при разрушении данных ак тивизируйте окно Breakpoints; в колонке Hit Count для этой точки прерывания в скобках вы увидите, сколько раз был исполнен цикл. Окно Breakpoints на рис. 5 6 демонстрирует состояние счетчика выполнений после возникновения разруше ния данных. Для неуправляемого кода имейте в виду, что состояние счетчика ра ботает, только если программа запущена «на полной скорости». При пошаговом проходе через точку прерывания счетчик выполнений не обновляется.

Рис. 5 6. Пример отображения оставшегося числа выполнений

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

207

 

 

Новым в счетчике выполнений является то, что вы в любое время можете сбро сить значение счетчика в 0. Вернитесь к окну Breakpoint, щелкните кнопку Hit Count и щелкните кнопку Reset Hit Count (сбросить счетчик выполнений) диалогового окна Breakpoint Hit Count. Еще одна приятность: вариант работы счетчика выпол нений может быть изменен в любой момент времени, а кроме того, можно изме нять заданное количество выполнений, не изменяя его текущее состояние.

Условные выражения

Второй модификатор точек прерывания по месту, позволяющий при корректном использовании сэкономить больше времени, чем какой либо еще тип точки пре рывания, — это условное выражение. Точка прерывания по месту, имеющая условное выражение, срабатывает, только если результат вычисления выражения становится верным (истина) или изменяется с момента предыдущего вычисления. Условное выражение получить управление именно тогда, когда это нужно. Отладчик может справиться почти с любым подброшенным ему выражением. Для добавления ус ловного выражения к точке прерывания откройте окно Breakpoint для точки прерывания по месту и щелкните кнопку Condition (условие), в результате чего появится диалоговое окно Breakpoint Condition (условие точки прерывания).

В поле ввода Condition введите условие, подлежащее проверке, и щелкните OK. Управляемый и неуправляемый коды имеют разную поддержку условий, и у каж дой свои «прелести», которые мы обсудим в последующих главах. Вкратце разли чия заключаются в том, что в управляемом коде вы можете вызывать из условных выражений методы и функции (будьте весьма осторожны) и нет поддержки псев дорегистров и псевдозначений (специальный код, начинающийся с символов @ или $). В неуправляемом коде вы не можете вызывать функции из своих услов ных выражений, но имеете доступ к псевдорегистрам и псевдозначениям.

И все же обе среды поддерживают общие выражения, которые можно интер претировать так: «Что находится в скобках выражения if, введенного в строке точки прерывания?» Вы располагаете полным доступом к локальным и глобальным пе ременным, так как они вычислены в контексте текущей области видимости вре мени исполнения. Модификатор условного выражения точки прерывания позво ляет напрямую проверять предположения, которые вы стремитесь доказать или опровергнуть. Заметьте: синтаксис выражения должен подчиняться правилам языка программирования, для которого установлена точка прерывания; поэтому не пу тайте And с ||.

По умолчанию обработчик условия прерывает исполнение, если результат вычисления введенного условного выражения равен true. Однако, если нужно прервать исполнение при изменении значения условия, вы можете изменить пе реключатель с Is True (является истиной) на Has Changed (изменен). Может сму тить то, что значение не вычисляется при вводе условия, но после некоторого раз мышления оказывается, что это имеет смысл. Первый раз вычисление произво дится, когда вы попадаете на точку прерывания. Так как условие никогда еще не вычислялось, отладчик не видит сохраненных значений во внутреннем поле вы ражения, поэтому он сохраняет новое значение и продолжает исполнение про граммы. Таким образом, возможно по меньшей мере два исполнения такой точки до того, как отладчик остановит исполнение программы.

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

Что еще хорошо в определении Has Changed, так это то, что введенное усло вие не обязательно должно быть реальным условием. Может быть введена также переменная, доступная в области видимости точки прерывания по месту, при этом отладчик будет вычислять и сохранять значение этой переменной, а вы получае те возможность остановиться при ее изменении. Прочтите материал по точкам прерывания в главах 6 и 7 для понимания отличительных особенностей услов ных модификаторов точки прерывания для управляемого и неуправляемого кода. Кроме того, для облегчения отладки неуправляемого кода имеются другие типы точек прерывания. Я хочу ответить на вопрос, который вертится у вас на языке (сняв, таким образом, напряженность): при отладке управляемого кода не поддер живаются глобальные точки прерывания.

Несколько точек прерывания на одной строке

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

После установки первой точки прерывания обычными методами хитрость установки второй таится в чудесных свойствах окна Breakpoint. Проще всего по казать это на примере. В следующем фрагменте перед каждой строкой простав лены номера строк в виде комментариев.

/* Исходный файл:

CSharpBPExamples.cs.

*/

/*84*/

for ( i

= 0 , m = 0 ;

i

< 10

; i++ , m— )

/*85*/

{

 

 

 

 

/*86*/

Console.WriteLine

(

"i =

{0} m = {0}" , i , m ) ;

/*87*/

}

 

 

 

 

Яустанавливаю первую точку прерывания на строке 86, щелкнув правой кнопкой

влевом поле и установив условное выражение в i==3. Чтобы установить вторую точку прерывания, переместите окно Breakpoints так, чтобы видеть номер стро ки исходной точки прерывания, и вызовите окно Breakpoint, нажав Ctrl+B. Щелк ните вкладку File (файл) диалогового окна Breakpoint, потому что эту точку пре рывания надо устанавливать там. Введите имя файла в поле ввода File и номер строки в поле ввода Line (строка), а в поле ввода Character (символ) оставьте сим вол 1. В этом примере я использовал файл CSharpBPExamples.CS, а номер строки — 86. Щелкните кнопку Condition и введите нужное условие для второй точки пре рывания; я введу m== 1.

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

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

209

 

 

лено полужирным начертанием. Интересно, что если щелкнуть правой кнопкой точку прерывания в окне с исходным кодом и выбрать из меню Breakpoint Proper ties, вы всегда увидите свойства первой точки прерывания, установленной на этой строке. Кроме того, если щелкнуть точку в левом поле, будут сняты обе точки пре рывания. Хотя приведенный здесь пример слегка надуман — можно было бы объе динить оба выражения с помощью оператора «или» (||) — множественные точки прерывания в строке весьма полезны при необходимости проверить два сложных выражения.

Окно Watch

Если бы я должен был дать Оскара за технические достижения и общую полез ность в Visual Studio .NET, легко победило бы окно Watch (окно наблюдения). Невероятная мощь, предлагаемая окном Watch и его родственниками: диалоговым окном QuickWatch (быстрое наблюдение), Autos (автопеременные), Locals (локаль ные данные), This/Me (этот класс), — позволяет быстро устранять ошибки, а не шарахаться целыми днями в поисках ответа.

Обращаю внимание: для изменения значений переменных годится любой род ственник окна Watch. К сожалению, многие программисты прошли через другие среды разработки, и некоторые из тех, кто много лет программировал для Windows, не осведомлены об этих возможностях. Возьмем окно Autos. Вы только выбирае те переменную или дочернюю переменную, значение которой хотите изменить, и щелкаете один раз поле Value. Просто введите новое значение, и переменная изменена.

Многие программисты рассматривают окно Watch как место, предназначен ное только для чтения, в которое они притаскивают свои переменные и наблю дают за ними. Окно Watch замечательно тем, что оно содержит полный комплект встроенных средств для вычисления выражений. Если вы хотите видеть что либо как целое, что на самом деле таковым не является, просто приведите или конвер тируйте его тип точно так же, как вы запрограммировали бы это на используе мом вами языке программирования. Простой пример: допустим, CurrVal объявле на как целое, а вы хотите видеть ее приведенной к булеву типу. В колонке Name (имя) окна Watch в C# и C++ введите (bool)CurrVal или для Visual Basic .NET введи те CBool(CurrVal). Значение будет отображаться как true или false.

Замена целого типа на булев не слишком впечатляет, но способность окна Watch вычислять выражения предоставляет вам прекрасные средства тестирования. Как я уже несколько раз говорил, область кода — это одна из целей, за которую надо бороться при блочном тестировании. Если, например, имеется условное выраже ние внутри функции и трудно на первый взгляд понять, что там вычисляется, и вы должны по шагам пройти ветви, соответствующие значению true и false соот ветственно, окно Watch становится вашим спасителем. Встроенная полновесная возможность вычисления выражений позволяет вам просто перетащить выраже ние вниз в окно Watch и наблюдать, что там вычисляется. Но есть и ограничения. Если ваше выражение вызывает всевозможные функции вместо использования пе ременных, у вас могут возникнуть проблемы. Взглянув на мой код, вы обнаружи те, что я следую такому правилу: если есть три или больше подвыражений в усло

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

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

Разберем следующий пример. Вы можете выделить все внутри внешних ско бок и перетащить в окно Watch. Однако, так как здесь три строки, окно Watch интерпретирует все это как три различных строки. Но можно последовательно скопировать в буфер обмена две строки, а затем вставить их в первую и, таким образом, построить полное выражение без необходимости много печатать. Как только выражение введено в строке окна Watch, в колонке Value отображается true или false в зависимости от значений переменных.

if ( ( eRunning == m_eState

) ||

(

eException == m_eState

)

&&

(

TRUE == m_bSeenLoaderBP )

)

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

Вызов методов в окне Watch

Иногда меня забавляют программисты, перешедшие в Windows программирова ние с ОС UNIX, настойчиво утверждающие, что UNIX лучше. Когда я спрашиваю, почему, они возмущенно отвечают: «В GDB можно вызвать функцию отлаживае мой программы из отладчика!» Я был удивлен, узнав, что оценки ОС вертелись вокруг загадочной функции отладчика. Конечно, такие приверженцы весьма бы стро остывали, когда я говорил им, что мы могли вызывать функции из отладчи ков Microsoft всегда. Вы можете удивиться, что же здесь так привлекает. Однако, если вы мыслите, как гуру отладки, то поймете, что способность выполнять фун кции отладчиком позволяет полностью настроить под себя среду отладки. Напри мер, вместо того чтобы потратить 10 минут, разглядывая 10 различных структур данных для определения совместимости данных, вы можете написать функцию, которая проверяет данные, и затем вызвать ее, когда она больше всего будет нуж на — когда ваше приложение остановлено в отладчике.

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

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