Параметры компиляции

Познакомившись с разными способами компиляции проектов и решений, мы переходим к описанию параметров компиляции отдельных проектов. Щелкните правой кнопкой мыши на имени проекта в окне решения и выберите команду 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 .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. В этом окне вы указываете, как должен действовать отладчик при обнаружении исключений определенного типа. Допустим, вы хотите, чтобы при возникновении ошибок доступа управление передавалось отладчику.

  1. Выберите исключение Win32Exceptions >0xc0000005.
  2. Установите в группе When the exception is thrown переключатель Break into the debugger.

В результате отладчик будет автоматически вызываться при возникновении ошибок доступа (0xc0000005), и вы сможете точно определить, в какой строке программы это произошло.

 

Отладка управляемого и неуправляемого кодов

Управляемым (managed) в .NET называется код, выполняемый при участии CLR. В управляемом коде нельзя использовать указатели, а выделением/освобождением памяти занимается CLR. Неуправляемый код не подчиняется этим ограничениям. Он может создаваться в C++ и С#, но в VB .NET такая возможность не поддерживается.

Управляемый код усложняет работу некоторых средств отладки. Дело в том, что исполнительная среда CLR прикладывает значительные усилия к оптимизации выполняемого кода, что затрудняет получение правильных кадров стека (то есть адресов всех вызванных функций). Кроме того, в зависимости от специфики программы оптимизация может достичь такой степени, что отображаемый в отладчике код плохо ассоциируется с исходным текстом. Впрочем, по сравнению с преимуществами новой среды отладки VB .NET эти проблемы уходят на второй план.