Visual Studio 2012 中针对Windows 8应用程序生命周期模型的新调试功能

Visual Studio 2012 中针对Windows 8应用程序生命周期模型的新调试功能

Rate This
  • Comments 0

[原文发表地址]  New Visual Studio 2012 Debugging Features for the Windows 8 App Lifecycle Model

[原文发表时间]  2012-08-23 10:00

Windows 8 带来了一种新的应用程序生命周期模型,其中 Windows 商店应用程序会为用户自动管理。即使它们不在屏幕上,从来没有运行过,这些应用程序总是觉得活着。这为能量消耗和电池寿命提供了极大的好处。

下面是我们推荐阅读有关这一主题的几篇相关博客文章:

  1. 构建 Windows 8博客: 构建电源智能的通用 Windows(见"Metro样式应用程序模式"一节)
  2. 构建 Windows 8博客:为应用程序提高电源效率(解释了不同应用程序的状态)
  3. Windows 8应用程序开发者博客: 管理应用程序生命周期,那样,你的应用程序觉得"始终是活着的"(解释了如何为不同的生命周期状态编程)

在这篇文章中,我们将看看这一切对于调试来说意味着什么。我们在Visual Studio 2012中所取得的所有调试改进中(从JavaScript 调试,到Windows 8 模拟器,到Windows RT 设备上的远程调试),Windows 8生命周期状态的调试体验和后台任务是其中最具挑战性的设计之一 !

模拟事件

在此过程中,我们遇到的第一个挑战是如何来模拟你的应用程序在现实世界使用中会遇到的事件,以便你可以调试这些有趣的情况。我们如何模拟由于发送一条文本消息,而造成另一个应用程序被激活,因此你的应用程序被暂停?我们如何模拟你的应用程序被终止,而没有结束调试会话?

我们在设计解决方案中使用的一个原则是我们想要一个简单的模型,以便你可以使用一套核心的调试命令来模拟你的应用程序可能会遇到的生命周期事件各种状态。因此,我们决定添加以下三个命令到 Visual Studio中:Suspend(暂停)、Resume( 继续)和" Suspend and Shutdown(暂停和关闭)"。

  1. 暂停:在应用程序处理事件之后,暂停命令让应用程序处于暂停状态。
  2. 继续:继续命令来继续运行应用程序,使其重新进入运行状态,并将它作为在前台活动的应用程序。
  3. "暂停和关闭""暂停和关闭"首先会"暂停"。然后 (一旦应用程序被暂停了),此命令将终止应用程序,并停止调试。

你可能想知道为什么我们需要创建一个"暂停和关闭"的命令。此命令的目的是模拟当你的应用程序由Windows 8暂停和终止时,发生的自然顺序事件。当一个应用程序被暂停时,它收到一个暂停的事件,在稍后激活 (从暂停到终止状态之后) 时,暂停事件处理程序通常会保存应用程序可能需要的数据。我们观察到用户尝试在预发行版上以其他方式模拟此。例如,我们看到一些用户只是停止调试,这将关闭应用程序,但没有触发暂停事件。其他用户会通过按 Alt + F4 或将其拖动到屏幕的底部来显式地关闭该程序。在这种情况下,在终止该应用程序之前,会触发一个暂停事件;但下一次用户激活该应用程序时,其PreviousExecutionState将是ClosedByUser (这不是我们试图模拟的).因此,"暂停和关闭"命令提供了一种方式来模拟你的应用程序被Windows暂停和终止,而不是由用户显式地关闭。

公开命令

在设计过程中,我们面临的下一个问题是如何公开这些命令。

在 Visual Studio 2012 Beta 版中,我们在"调试位置"工具栏中为这些命令创建了专用的按钮。我们选择此工具栏,因为它提供了独特的功能来在运行模式中选择一个进程。当调试多个进程时,这可以轻松地确定应用这些命令到哪个进程中。

从Visual Studio 2012 RC (和持续的 Visual Studio 2012 RTM) 开始,我们在同一"调试位置"工具栏中折叠了这些按钮到一个下拉列表中。下拉列表的设计为我们想要公开的多个命令提供了更多的空间,而且不会干扰工具栏:

image

请注意"调试位置"工具栏不是总是被启用的。因此,如果你看不到此工具栏,请通过视图菜单启用它:

image

应用程序激活

我们想要允许你在调试器中模拟的另一个例子是应用程序激活。

当你开始在 Visual Studio中调试Metro样式应用程序中,默认情况下,应用程序自动被激活。(这与磁贴激活非常类似。)

不过,还有一些激活你的应用程序和你也想要模拟的其他方式。例如,你的应用程序可以接收与另一个应用程序共享的某些内容,并通过协议或扩展激活。(有关其工作原理的更多信息,请参阅共享内容目标应用程序示例。)

从 Visual Studio 2012 beta 版本开始,我们添加了功能来让你更改项目属性以便在调试时不启动应用程序(为了模拟这些其他激活的方案)。当你设置此选项,启动调试你的项目时,Visual Studio 2012 将进入调试模式,但实际上没有运行任何东西。你还会注意到"调试位置"工具栏上显示了你的项目名称,而不是显示正在运行的进程。

image

这表明由该项目部署的应用程序软件包是在调试模式下,一旦该软件包的应用程序被激活了,调试器就会附加到进程中。

image

例如 (正如上文所述的共享内容目标应用程序示例),我们可以模拟与另一个应用程序共享文本,并选择示例应用程序作为共享目标。在这种情况下,应用程序被激活了,我们可以调试它:

image

请注意,现在"调试位置"工具栏显示正在运行的实际进程。

调试后台任务

我们想要允许你在调试器中模拟另一个 Windows 8 行为,这就是后台任务。后台任务的背后想法是你的应用程序可能需要在后台执行某些操作,虽然这类应用程序不在屏幕上,也没有运行。若要了解如何编程后台任务,请参阅Windows 8应用程序开发者博客中的以下文章:后台的高效性 — — 后台任务

后台任务是由像计时器事件这样的系统事件所触发的。(你的应用程序至少需要运行一次来注册任务)。后台任务在提供寄宿的系统中正常运行(针对JavaScript的 backgroundTaskHost.exe 或 wwahost.exe),但是,你也可以为一些后台任务触发器提供你自己的可执行文件。无论哪个进程承载该任务,后台任务都作为你的软件包的一部分运行。

我们为后台任务设计了调试体验来利用运行时相同的自动附加功能。就是说,当你的软件包在调试模式下时,一旦开始之后,调试器会自动附加到承载进程中。

假设,你可以在某一时间调试来自多个软件包的应用程序,我们需要在一个控件中展示这些,而且这个控件能够基于任务的数量而扩展。因此,我们添加这些到上图所示的同一"调试位置"工具栏下拉列表控件中。其结果是,为当前活动状态的软件包而注册的所有后台任务的触发器命令都将出现在此下拉列表中。作为一个例子,当调试后台任务示例时,你将在下拉列表中(一旦注册)看到以下后台任务

image

下一步,若要调试后台任务,添加一个断点到Run方法中,然后触发后台任务:

image

看到了吧,调试你的后台任务是多么的简单 !

请注意此设计的几种例外情况 …具有数据有效负载 (例如,在 IBackgroundTaskInstance 中的 TriggerDetails) 的后台任务不能通过 Visual Studio触发,若要调试,必须由系统自然地触发。同样适用于ControlChannelPushNotificationSmsReceived触发器。然而,所有其他后台任务触发器都可以通过 Visual Studio触发。

摘要

当你开发你的 Windows 商店应用程序时,Windows 8应用程序生命周期模型带来一些可供考虑的新调试方案。使用 Visual Studio 2012,你可以模拟你的应用程序会遇到的事件和状态,它可以被暂停和继续。通过将软件包放在调试模式下,无需激活应用程序,Visual Studio 2012 还提供了一种方法来调试不同的应用程序的激活机制。最后,你可以使用调试位置工具栏下拉菜单来触发后台任务。有关这一主题的详细信息,请参阅MSDN 文档。我们期待着在Connect论坛,或UserVoice上听到你的想法!

 

clip_image002Dmitri Leonov –  Visual Studio Ultimate 团队,软件测试开发工程师。

简介: Dmitri Leonov 于 2008年加入Visual Studio团队,自那时起他一直在调试团队中工作,在那儿目前他专注于JavaScript调试。

特别感谢Lisa Feigenbaum为这篇文章供稿。

Leave a Comment
  • Please add 6 and 8 and type the answer here:
  • Post