Windows 8

Приступаем к отладке приложений Windows Store

Бруно Теркали
Роберт Эванс

Обращайтесь за помощью в создании вашего приложения Windows Store на bit.ly/XLjOrx.
Вы получите инструментарий, помощь и поддержку в разработке приложений Windows Store.

Эта статья относится к еще не выпущенным версиям продуктов. Любая изложенная здесь информация может быть изменена.

Продукты и технологии:
Windows 8.1 Preview, Visual Studio 2013 Preview, Windows SDK for Windows 8.1 Preview

В статье рассматриваются:

  • управление жизненным циклом процесса;
  • фоновые задачи и активация;
  • использование Process Explorer для анализа выполняемого приложения;
  • изучение кода с помощью JustDecompile.

В 40-х годах прошлого века, когда одна из программ контр-адмирала Грейс Хоппер (Admiral Grace Hopper) перестала правильно работать, она обнаружила мотылька, попавшего между двух реле в электромеханическом компьютере Mark II, который был установлен в Гарварде; с тех пор и родился термин «bug» («жучок»), или просто ошибка. Конечно, сегодня отладка (debugging) не имеет ничего общего с насекомыми. Это процесс поиска и исправления дефектов в программах.

Несмотря на тот факт, что современные языки и инструменты программирования прошли большой путь в своем развитии и помогают разработчикам писать надежный код, от ошибок в логике никто не застрахован. Современные компиляторы могут выполнять лишь рудиментарные проверки синтаксиса языка программирования и правильность использования системы типов. Компилятор мало чем способен помочь в определении реального поведения вашей программы в период выполнения. Вот здесь и нужны навыки в отладке. Эта статья посвящена отладке приложений Windows Store и исследованию некоторых методик, применяемых в этой области.

Мы будем использовать Visual Studio 2013 Preview, хотя упомянутые методики, в целом, работают и с более ранними версиями этого продукта. Однако, прежде чем начать, вам потребуется подготовить свою среду к более продвинутой отладке, чем это возможно при использовании только Visual Studio. Мы рекомендуем скачать и установить следующие ресурсы:

Управление жизненным циклом процесса

В случае типичных настольных приложений пользователь запускает программу, и она выполняется, пока не завершится. При этом она работает, даже если ее окно невидимо. Приложения Windows Store устроены несколько иначе. Когда окно приложения скрыто, Windows-служба Runtime Broker приостанавливает все потоки в приложении и пробуждает их, только когда его окно выводится на передний план. Эта новаторская особенность помогает экономить системные ресурсы в целом и продлевает время работы от аккумулятора. В Windows 8.1, даже когда пользователь закрывает приложение, по умолчанию оно переводится в приостановленное состояние и не завершается. Если вы предпочитаете более старую функциональность Windows 8, то можете установить свойство Windows.ApplicationModel.ClosePolicy.TerminateOnClose в true.

Приложению посылаются события Suspend и Resume, что дает шанс сохранить или получить состояние либо предпринять другие необходимые действия. Кроме того, если приложение потребляет слишком много памяти или запускается чрезмерно долго, Runtime Broker принудительно завершит это приложение, уничтожив все его потоки. Visual Studio автоматически отключает управление жизненным циклом процесса (Process Lifecycle Management, PLM) для приложений под отладкой независимо от того, отлаживаете вы свое приложение или подключаетесь к установленному в системе приложению (используя Debug | Debug Installed App Package). Важно, что PLM отключается, потому что в ином случае вы не смогли бы должным образом отлаживать приложение. Причина проста: Runtime Broker может вмешаться и принудительно завершить ваше приложение до того, как вы получите шанс на его отладку.

Однако некоторые отладчики, внешние для Visual Studio, например Windows Debugger (WinDbg) и Microsoft Console Debugger (CDB), требуют отключить средства PLM вручную. Для этого можно воспользоваться утилитой PLMDebug, доступной в Windows 8.1 SDK. PLMDebug — это утилита командной строки, позволяющая отключать PLM для конкретного пакета .appx, используя ключ /enableDebug. Просмотреть все установленные пакеты приложений и найти идентификатор нужного пакета .appx можно командой Get-AppxPackage из Windows PowerShell или через Process Explorer (как будет описано далее в этой статье).

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

В PLMDebug есть несколько удобных функций. Например, она позволяет явным образом посылать в ваше приложение разнообразные события, включая Suspend, Resume, Terminate, Force-terminate и Clean-terminate. Она также позволяет подключать отладчик для отладки в активном режиме (эта тематика не рассматривается в данной статье).

Кроме того, Visual Studio дает возможность инициировать события Suspend и Resume, используя панель инструментов Debug Location (по умолчанию она не показывается). Вы можете добавить ее, выбрав View | Toolbars | Debug Location. Варианты отладки станут доступными, как только вы начнете отладку своего приложения. На рис. 1 показана панель инструментов Debug Location в Visual Studio 2013 Preview.

Панель инструментов Debug Location
Рис. 1. Панель инструментов Debug Location

Фоновые задачи

Многие сценарии, например обновление активной плитки, можно выполнять без использования фоновой задачи, но иногда фоновые задачи необходимы, и они представляют другой способ, благодаря которому код вашего приложения Windows Store можно запускать неявным образом в соответствии с определенными вами системными условиями. Так, вы, возможно, захотите добавлять или создавать эскизные представления для одного из ваших приложений в фоне, но только при том условии, что устройство питается от электросети. Maintenance Trigger позволяет запускать некоторые задачи на основе заданных периодов времени и системных условий, а также выполнять эти задачи регулярно. Хотя код для фоновых задач определяется в приложении, в большинстве случаев он выполняется отдельным процессом с именем BackgroundTaskHost.

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

Приложение Windows Store регистрирует свои фоновые задачи в инфраструктуре фоновых задач уровня операционной системы, используя класс BackgroundTaskBuilder. Фоновая задача создается как класс, реализующий интерфейс IBackgroundTask, и вам нужно просто реализовать метод Run. Фоновая задача должна иметь ровно один триггер и набор из одного или более условий, описывающих точные обстоятельства, в которых следует запускать эту фоновую задачу. Триггер указывается с помощью метода SetTrigger класса BackgroundTaskBuilder.

Visual Studio упрощает поиск и отладку зарегистрированных фоновых задач, так как панель инструментов Debug Location будет показывать объявленные вашим приложением фоновые задачи и позволит запускать их через визуальный интерфейс Visual Studio. Эта методика работает для всех фоновых задач, кроме тех, которые используют ControlChannelTrigger, PushNotificationTrigger или SystemTrigger с типом триггера SmsReceived. Подробнее на эту тему см. документ «Introduction to Background Tasks» по ссылке aka.ms/O35jqc. Хороший пример кода вы найдете по ссылке bit.ly/IZpfqN.

Активация

Ваше приложение может запускаться многими способами в зависимости от того, какие типы активации вы реализовали, например File, Protocol, PrintTaskSettings или ShareTarget. В частности, тип активации ShareTarget действует, когда пользователь делится чем-то из другого приложения с вашим.

В Windows 8.1 в активацию внесен ряд изменений. Так, активация Search перешла в разряд нерекомендуемой, но обратная совместимость пока сохранилась. Также появился новый подход к запуску других приложений, которые делят экран с вашим приложением. Это означает, что вы можете делить экран с браузером, пока ваше приложение остается активным. Подробнее об этой возможности см. по ссылке bit.ly/11ckVS3.

Для отладки приложения при одном из этих типов активации вы должны первым делом перейти в свойства проекта этого приложения, относящиеся к действиям при запуске. Щелкните правой кнопкой мыши ContosoCookbook в Visual Studio Solution Explorer и выберите Properties. Установите флажок Do not launch, but debug my code when it starts (рис. 2). Тогда вы сможете отлаживать свое приложение и помещать точки прерывания в обработчик OnLaunched, запускаемый при активации по любому из других типов. Этот параметр сообщает приложению быть готовым к отладке, но не осуществлять настоящий запуск, когда вы открываете сеанс отладки. Приложение будет просто ждать.

Настройка свойств отладчика
Рис. 2. Настройка свойств отладчика

Анализ выполняемого приложения

Process Explorer предоставляет некоторые полезные средства, если вы хотите заглянуть в то, что творится в выполняемом приложении. Чтобы посмотреть эти средства, мы исследуем кое-какой код в приложении Kids Car Colors, которое можно скачать по ссылке bit.ly/YnmAxT. Перейдите на экран Start и запустите Kids Car Colors, а затем запустите Process Explorer (предполагается, что вы уже установили его).

Если вы раскроете узел svchost.exe, то увидите Runtime Broker и выполняемые приложения Windows Store, как показано на рис. 3. Щелкнув правой кнопкой мыши KidsCarColors.exe, вы можете просмотреть свойства, такие как корневую папку установки.

Process Explorer от SysInternals
Рис. 3. Process Explorer от SysInternals

Окно Properties приложения в Process Explorer предоставляет массу информации. Например, как показано на рис. 4, вкладка Image позволяет узнать путь, по которому установлено данное приложение. И встроенные приложения, и приложения, скачиваемые из Windows Store, всегда устанавливаются в папку [Root Folder]\Program Files\Windows Apps.

Свойства приложения Kids Car Colors
Рис. 4. Свойства приложения Kids Car Colors

Кроме того, вы найдете очень полезной вкладку .NET Performance; на ней показывается информация базовых счетчиков производительности, включая такие вещи, как размеры куч, количество процедур сбора мусора объектов нулевого поколения (Gen 0 Collections) и процент времени, потраченный на сбор мусора (garbage collection, GC). Анализ этих счетчиков позволяет оценить эффективность GC — механизма, освобождающего память от объектов, на которые больше нет ссылок. Вам может понадобиться модифицировать код приложения для более агрессивной стратегии освобождения памяти. Подробнее о счетчиках производительности для .NET см. по ссылке msdn.microsoft.com/library/w8f5kw2e.

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

Вам может понадобиться смена владельца и изменение разрешений для папки C:\Program Files\Windows Apps, чтобы получить возможность просматривать приложения, находящиеся в ней.

В C:\Program Files\Windows Apps для каждого установленного приложения имеются свои подкаталоги. Каждый из них предоставляет уйму информации, но об этом — в следующем разделе.

Изучение кода

Как отмечалось, вы можете войти в каталог установки индивидуального приложения и найти много информации о нем, например все MP3-файлы (если таковые есть), изображения, XAML-файлы и другие ресурсы. Однако вы не сможете просмотреть XAML-файлы для приложений Windows 8.1, так как они компилируются в двоичный файл. Но существуют разнообразные утилиты, позволяющие декомпилировать исполняемые файлы приложения Windows Store, написанного на C# и Visual Basic .NET.

Мы декомпилируем KidsCarColors.exe, используя утилиту JustDecompile от Telerik. Декомпиляция — это процесс генерации читаемого исходного кода на основе двоичного файла. Для этого просто перейдите в каталог установки приложения, как пояснялось ранее, щелкните правой кнопкой мыши KidsCarColors.exe и выберите Open в утилите JustDecompile. Как показано на рис. 5, теперь вы можете увидеть низкоуровневые детали кода, раскрытые декомпилятором. Заметьте, что модель данных внутри приложения легко дешифруется и просматривается. JustDecompile облегчает восстановление утерянного исходного кода или изучение сборок для понимания корневой причины внешней ошибки. То есть вы можете просматривать исходный код практически любого установленного приложения Windows Store.

Декомпиляция KidsCarColors.exe
Рис. 5. Декомпиляция KidsCarColors.exe

Примечательно, какой большой объем информации доступен с помощью этой утилиты. При создании Kids Car Colors пришлось потратить немало усилий на то, чтобы заставить нормально работать звук, когда ребенок выбирал цвет машины. Но весь код теперь как на ладони. Если вы перейдете к объекту ItemDetailPage в средстве просмотра проектов в JustDecompile, то сможете точно понять, как проигрываются звуковые файлы: MP3 извлекается из локального хранилища, создаются экземпляры различных MediaElement, регистрируются события обратных вызовов media, вызывается SetSource и т. д. Для любого, кто хочет воспроизвести этот подход, видно все, что нужно.

JustDecompile облегчает восстановление утерянного исходного кода или изучение сборок для понимания корневой причины внешней ошибки.

JustDecompile предоставляет несколько кнопок на своей панели инструментов, в том числе кнопку Assembly List, которая позволяет исследовать ссылки, заданные приложением. Просто зная, какие ссылки установлены приложением Windows Store, уже подсказывает, какую функциональность использует это приложение. Например, вы можете увидеть, что Kids Car Colors использует Advertising SDK. Это имеет смысл, так как приложение действительно показывает рекламу. Но теоретически вы могли бы задать ссылку на некую сборку, которой вы вовсе не пользуетесь. Вообразите, что мы удалили рекламу внутри приложения и забыли убрать ссылку на сборку Advertising SDK. JustDecompile позволяет точно узнать, какая версия используется в действительности и как выглядят код и ссылки.

JustDecompile также включает функцию Find Usages, которая позволяет реплицировать команду Find All References в Visual Studio. Вы можете просто щелкнуть при нажатой клавише Ctrl любое пространство имен, тип или член в своем декомпилированном коде и получить список всех соответствующих ссылок в коде. Это может колоссально помочь в изучении того, как работает приложение, в отсутствие его исходного кода.

Кнопка позволяет исследовать ссылки, заданные приложением.

Заключение

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


Бруно Теркали (Bruno Terkaly) — разработчик-идеолог в Microsoft. Его глубокие знания обусловлены долголетним опытом работы в различных областях, написанием кода с использованием множества платформ, языков, инфраструктур, SDK, библиотек и API. Основное внимание в своей работе он уделяет написанию кода, ведению блога и проведению презентаций по созданию облачных приложений, в частности на платформе Microsoft Azure. Читайте его блог blogs.msdn.com/b/brunoterkaly.

Роберт Эванс (Robert Evans) — главный инженер техподдержки и технический руководитель Windows Store App Labs. Обладает сертификатами Microsoft Certified Professional Developer и Windows 8 Dev Bootcamp Master Instructor. Выступал с презентациями на TechReady, GeekReady и The Tablet Show, представлял Windows 8 Hardware Lab на конференции Microsoft Build. До этого проработал 12 лет инженером-разработчиком ПО в Microsoft, трудился над различными продуктами, такими как Xbox Live, MSN и Mobile Engineering. Вы можете читать блог Premier Field Engineering, в котором он публикует свои статьи, по ссылке aka.ms/Utg864.

Выражаем благодарность за рецензирование статьи эксперту Microsoft Кристофу Назару-Солье (Christophe Nasarre-Soulier).