Параметры компиляции
Познакомившись
с разными способами компиляции
проектов и решений, мы переходим к
описанию параметров компиляции
отдельных проектов. Щелкните
правой кнопкой мыши на имени
проекта в окне решения и выберите
команду Properties > Configuration Properties >
Build — на экране появляется окно для
настройки параметров компиляции.
Например, параметр Debugging позволяет
задать аргументы командной строки.
Рис. 2.24. Диалоговое
окно свойств проекта
По сравнению с VB6
параметров совсем немного. Впрочем,
жалеть об этом не нужно: многое из
того, чем в VB6 приходилось
заниматься вам, в CLR делается
автоматически. В частности, в
параметрах компиляции можно
указать, нужно ли создавать
отладочную информацию (см.
следующий раздел), определять
константы DEBUG и TRACE и выдавать
предупреждения [ Очень трудно
представить ситуацию, в которой
отключение предупреждений было бы
оправдано. ]. Константы DEBUG и TRACE
выполняют те же функции, что и в VB6:
они позволяют использовать в
программе команды условной
компиляции:
#If DEBUG Then
Debug.WriteLine("In
debug mode")
#End If
#If TRACE Then Trace.
WhteLirie( "Tracing")
#End If
Если константа
DEBUG не определена, то проверка в
первой строке не проходит и команда
Debug.WriteLine не выполняется. То же самое
происходит и при проверке
константы TRACE.
В категории
Optimizations списка Configuration Properties можно
отключить проверку целочисленного
переполнения — впрочем, делать это
нежелательно. Вероятно, Microsoft
добавит новые способы оптимизации
в окончательной версии VB .NET или в
дополнениях.
Отладочная и окончательная версии
В верхней части
диалогового окна Project Properties >
Configuration Properties > Build находится
раскрывающийся список Configuration,
состоящий из трех пунктов: Release (Окончательная
версия), Debug (Отладочная версия) и All
Configurations (Все конфигурации). При
помощи этого списка можно задавать
разные наборы параметров для
разных типов компиляции. Например,
когда работа над приложением
близится к концу, в окончательной
версии можно изменить некоторые из
параметров, установленных ранее в
отладочной версии. Для этого
следует выбрать в списке пункт Release
и произвести дополнительную
настройку. Кнопка Configuration Manager
позволяет задать параметры
компиляции сразу для нескольких
проектов.
Обычно
различия между версиями сводятся к
включению отладочной информации
или разрешению/запрету оптимизаций.
Мы рекомендуем в процессе
разработки использовать
отладочную конфигурацию, а затем
построить итоговый вариант
продукта в окончательной
конфигурации. Например, в
отладочной конфигурации можно
включить режим интерпретации
предупреждений как ошибок («Treat
warnings as errors»), а в окончательной
конфигурации — отключить его.
Что же
получается в результате компиляции
проекта? На рис. 2.25 показана
структура каталогов,
сгенерированных IDE для решения vb_ide_01.
Рис. 2.25. Дерево
каталогов после компиляции
Как упоминалось
выше, исходные файлы хранятся на
верхнем уровне иерархии, в каталоге
vb_ide_01. В каталог bin помещаются
двоичные файлы, полученные при
компиляции, — в нашем примере
создаются файлы с расширениями .ехе
и .pdb. Файл с расширением .pdb содержит
отладочную информацию и создается
только в том случае, если
отладочная информация была
затребована в диалоговом окне
параметров компиляции (Project > Configuration
Properties > Build).
В этом разделе
приводится краткий обзор изменений
в средствах отладки VB .NET. Мы
вернемся к этой важной теме позже,
когда у нас появится
содержательный код для отладки. К
сожалению, начинать приходится с
печального известия. Если раньше VB
позволял прервать работу программы,
отредактировать ее и продолжить
выполнение с учетом внесенных
изменений, то начиная с бета-версии
2 эта возможность не
поддерживается. Программу можно
редактировать в процессе отладки,
однако изменения вступают в силу
лишь после повторной компиляции.
Впрочем, различные средства
пошагового выполнения и прерывания
программ (такие как условные точки
прерывания) работают так же, как и
прежде.
И все же можно с
уверенностью сказать, что
существование общего отладчика
уровня VS .NET, по своим возможностям
сравнимого с отладчиком VC++,
является одним из самых заметных
усовершенствований VB .NET на фоне
предыдущих версий VB. Значительно
расширились возможности работы со
всеми составляющими приложения,
вплоть до отладки на уровне
загруженных модулей и программных
потоков.
Для
работы отладчика необходим файл .pdb
с отладочной информацией. Чтобы
создать этот файл, необходимо
установить флажок Generate symbolic debug
information в диалоговом окне параметров
компиляции. По данным файла .pdb
отладчик определяет, какая строка
исходного текста соответствует
текущей позиции исполняемого файла
и какие символические имена были
присвоены переменным программы.
Без отладочной информации
неполадки придется искать в
ассемблерном листинге.
Отладчик VB .NET
обладает некоторыми новыми
возможностями, отсутствовавшими в
VB6. Краткая сводка этих
возможностей приведена ниже.
Окно памяти
предназначено для просмотра
фактического содержимого заданной
области памяти. Ни в одной из
прежних версий VB не поддерживалась
эта возможность, чрезвычайно
полезная в некоторых ситуациях —
например, если вы хотите проследить
за выполнением низкоуровневого
кода и выяснить, что же именно происходит
при работе вашей программы. Окно
памяти вызывается в IDE командой Debug >
Windows > Memory > Memory1 (или 2-4).
Примерный вид окна памяти показан
на рис. 2.26. Если щелкнуть в окне
памяти правой кнопкой мыши,
появится контекстное меню, в
котором выбирается представление
выходных данных.
С технической
точки зрения в любом сеансе отладки
всегда задействован некоторый
процесс (о процессах рассказано в
главе 10). В предыдущих версиях VB
отладчик не позволял подключаться
к работающим процеЪсам — такая
возможность была предусмотрена
только в отладчике Visual C++. В VB .NET
команда Debug > Processes выводит
диалоговое окно, показанное на рис.
2!27.
Рис. 2.26. Окно
памяти
Рис. 2.27. Выбор
процесса для отладки
Чтобы начать
отладку, выделите процесс в списке
и щелкните на кнопке Attach. После
подключения к процессу кнопка Break
выводит информацию о текущем
состоянии приложения. Если
отладочная информация отсутствует,
выводится листинг на языке
ассемблера. После нажатия кнопки
Attach на экране появляется
диалоговое окно, в котором вам
предлагается выбрать, что же вы
собираетесь отлаживать — машинный
код, код CLR, сценарий и т. д. В
большинстве случаев отлаживается
либо машинный код, либо код CLR. Длл
примера мы запустили экземпляр
приложения Notepad.exe и подключились к
нему в отладчике VB .NET. Результат
показан на рис. 2.28.
Рис. 2.28. Отладка
процесса Notepad.exe
Листинг
выглядит устрашающе, поскольку мы
не располагаем отладочной
символической информацией для
программы Notepad.exe. При наличии этих
данных в окне появился бы фрагмент
исходного текста функции,
выполнявшейся в момент передачи
управления отладчику.
В отладчике VB .NET
предусмотрено еще одно важное
средство — просмотр всех
выполняемых потоков (threads)
приложения. Переключение потоков в
отладчике играет очень важную роль
в отладке многопоточных приложений.
Мы вернемся к этой теме в главе 10
при знакомстве с многопоточным
программированием.
На первый
взгляд управление исключениями
кажется экзотикой, не связанной с
практической работой. Чтобы
оценить эту возможность по
достоинству, достаточно оказаться
в ситуации, когда на стадии
тестирования возникают
многочисленные исключения (см.
главу 7) и возникает необходимость в
тонкой настройке действий,
выполняемых при возникновении
исключений. Это делается в
диалоговом окне, вызываемом
командой Debug > Windows > Exceptions. В
этом окне вы указываете, как должен
действовать отладчик при
обнаружении исключений
определенного типа. Допустим, вы
хотите, чтобы при возникновении
ошибок доступа управление
передавалось отладчику.
- Выберите
исключение Win32Exceptions >0xc0000005.
- Установите
в группе When the exception is thrown
переключатель Break into the debugger.
В результате
отладчик будет автоматически
вызываться при возникновении
ошибок доступа (0xc0000005), и вы сможете
точно определить, в какой строке
программы это произошло.
Отладка управляемого и неуправляемого кодов
Управляемым (managed)
в .NET называется код, выполняемый
при участии CLR. В управляемом коде
нельзя использовать указатели, а
выделением/освобождением памяти
занимается CLR. Неуправляемый код не
подчиняется этим ограничениям. Он
может создаваться в C++ и С#, но в VB .NET
такая возможность не
поддерживается.
Управляемый код
усложняет работу некоторых средств
отладки. Дело в том, что
исполнительная среда CLR
прикладывает значительные усилия к
оптимизации выполняемого кода, что
затрудняет получение правильных
кадров стека (то есть адресов всех
вызванных функций). Кроме того, в
зависимости от специфики программы
оптимизация может достичь такой
степени, что отображаемый в
отладчике код плохо ассоциируется
с исходным текстом. Впрочем, по
сравнению с преимуществами новой
среды отладки VB .NET эти проблемы
уходят на второй план.