Отладка фоновой задачи

Важные API

Узнайте, как отладить фоновую задачу, выполнив в том числе активацию фоновой задачи и трассировку отладки в журнале событий Windows.

Сравнение отладки фоновых задач, выполняемых вне процесса, с фоновыми задачами внутри процесса

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

Правильная настройка параметров проекта фоновой задачи

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

  • Для приложений на языках C# и C++ основной проект должен ссылаться на проект фоновой задачи. Если такой ссылки нет, то фоновая задача не будет включена в пакет приложения.
  • В коде на языке C# или C++ параметр Тип вывода проекта фоновой задачи должен иметь значение "Компонент среды выполнения Windows".
  • Фоновый класс необходимо объявить в атрибуте точки входа в манифесте пакета.

Ручная активация фоновых задач для отладки их кода

Фоновые задачи могут быть запущены вручную через Microsoft Visual Studio. После этого можно по шагам выполнять код и его отладку.

  1. В C# поместите точку останова в метод Run фонового класса (для фоновых задач внутри процесса установите точки останова в App.OnBackgroundActivated()) и/или напишите отладочный вывод с помощью System.Diagnostics.

    В C++ поместите точку останова в функцию Run фонового класса (для фоновых задач внутри процесса установите точки останова в App.OnBackgroundActivated()) и/или напишите отладочный вывод с помощью OutputDebugString.

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

    Примечание

    Параметры панели инструментов События жизненного цикла не отображаются по умолчанию в Visual Studio. Чтобы отобразить эти параметры, щелкните правой кнопкой мыши текущую панель инструментов в Visual Studio и убедитесь, что параметр Расположение отладки включен.

    Для того чтобы это работало, фоновая задача должна быть уже зарегистрирована и ожидать запуска. Например, если фоновая задача была зарегистрирована с одноразовым триггером времени TimeTrigger, который уже был активирован, запуск задачи через Visual Studio не сработает.

    Примечание

    Фоновые задачи, использующие следующие триггеры, нельзя активировать таким образом: триггер приложения, триггер MediaProcessing, ControlChannelTrigger, PushNotificationTrigger и фоновые задачи с помощью SystemTrigger с типом триггера SmsReceived .
    ApplicationTrigger и MediaProcessingTrigger можно установить в коде вручную с помощью trigger.RequestAsync().

    отладка фоновых задач

  3. При активации фоновой задачи отладчик подключается к ней и отображает отладочный вывод в Visual Studio.

Отладка активации фоновой задачи

Примечание

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

Активация фоновой задачи зависит от трех условий:

  • Имя и пространство имен класса фоновой задачи.
  • Атрибут точки входа, указанный в манифесте пакета.
  • Точка входа, заданная приложением при регистрации фоновой задачи.
  1. Используя Visual Studio, определите точку входа фоновой задачи:

    • В коде на языке C# или C++ запомните имя и пространство имен класса фоновой задачи, указанные в проекте фоновой задачи.
  2. С помощью конструктора манифеста проверьте, правильно ли объявлена фоновая задача в манифесте пакета.

    • В коде на языке C# или C++ атрибут точки входа должен соответствовать пространству имен фоновой задачи, за которым следует имя класса. Например: RuntimeComponent1.MyBackgroundTask.
    • Кроме того, необходимо указать все типы триггеров, которые использует задача.
    • Исполняемый файл НЕ СЛЕДУЕТ указывать, если только вы не используете ControlChannelTrigger или PushNotificationTrigger.
  3. Только Windows. Чтобы увидеть точку входа, используемую Windows для активации фоновой задачи, включите трассировку отладки и используйте журнал событий Windows.

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

    1. Перейдите на начальный экран и откройте просмотр событий (для этого найдите и запустите файл eventvwr.exe).
    2. Перейдите в раздел Журналы приложений и служб ->Microsoft ->Windows ->BackgroundTaskInfrastructure в средстве просмотра событий.
    3. В области действий выберите Просмотр ->Показать журналы аналитики и отладки , чтобы включить ведение журнала диагностики.
    4. Выберите Журнал диагностики и щелкните Включить журнал.
    5. Теперь попробуйте еще раз использовать ваше приложение для регистрации и активации фоновой задачи.
    6. Просмотрите в журналах диагностики подробную информацию об ошибке. Эта информация будет содержать точку входа, зарегистрированную для фоновой задачи.

Просмотр событий для информации об отладке фоновых задач

Фоновые задачи и развертывание пакета Visual Studio

Если приложение, использующее фоновые задачи, развертывается с помощью Visual Studio, а версия (основная и/или дополнительная), указанная в манифесте Designer, обновляется, то последующее повторное развертывание приложения с помощью Visual Studio может привести к остановке фоновых задач приложения. Эту проблему можно решить следующим образом:

  • Используйте Windows PowerShell для развертывания обновленного приложения (вместо Visual Studio), запустив сценарий, созданный вместе с пакетом.
  • Если вы уже развернули приложение с помощью Visual Studio и его фоновые задачи остановились, перезагрузите или выйдите из системы или войдите в систему, чтобы фоновые задачи приложения снова работали.
  • Вы можете выбрать параметр отладки "Всегда переустанавливать мой пакет", чтобы избежать этого в проектах C#.
  • Дождитесь, пока приложение будет готово к окончательному развертыванию, чтобы увеличить версию пакета (не изменяйте ее во время отладки).

Комментарии

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

Дополнительные сведения об использовании VS для отладки фоновой задачи см. в статье Активация событий приостановки, возобновления и фоновых событий в приложениях UWP.