从“性能和诊断”页运行分析工具

适用于 Windows 和 Windows Phone

可通过使用 Visual Studio 探查器和诊断工具,来分析 Windows 应用商店应用和 Windows Phone 应用程序的性能、内存使用和能耗。 利用性能和诊断中心,可以轻松选择并运行这些工具、将多个工具组合到单个诊断运行中以及管理它们生成的报告。 可以在大多数部署目标上运行这些工具。 对于 Windows Phone 应用程序,请使用电话或仿真程序。 对于 Windows 应用商店应用,请使用 Visual Studio 计算机、模拟器或远程 PC。 在收集数据后,诊断报告将显示数据的时间线图和详细信息视图。 性能和诊断报告筛选器和设置可帮助你将精力放在数据的关键部分上。

性能和诊断中心内的工具

性能和诊断中心显示了可对特定类型的应用程序(XAML 和 C#/VB/C++ 或 HTML 和 JavaScript)使用的工具以及可在单个诊断运行中使用的工具。

CPU 使用率(全部)

能耗(全部)

内存使用率 (C#/VB/C++)

JavaScript 内存使用率

XAML UI 响应能力

HTML UI 响应能力

JavaScript 函数计时

本文内容

  • 快速入门:收集诊断数据

  • 收集诊断数据

    添加用户标记以标识诊断数据中的位置 | 设置启动项目 | 设置分析目标 | 选择要在诊断会话中运行的工具 | 启动和停止诊断会话

  • 打开诊断会话文件

  • “性能和诊断”数据页

  • 疑难解答

快速入门:收集诊断数据

备注

你必须拥有管理员特权才能运行性能和诊断工具。启动诊断会话时,你可以管理员身份运行 Visual Studio,也可以管理员身份运行工具。

  1. 在 Visual Studio 中打开项目。

  2. 设置部署位置。

    仅适用于 Windows Phone

    Windows Phone 应用程序可部署到电话或某个 Visual Studio 仿真程序。

    仅适用于 Windows

    Windows 应用商店应用可部署到 Visual Studio 计算机、Visual Studio 模拟器或联网的 PC 或平板电脑。

    注意:在远程 PC 或平板电脑上运行诊断会话要求在远程目标上安装并运行 Visual Studio 远程工具。 请参阅在远程计算机上从 Visual Studio 运行 Windows 应用商店应用.

    从调试器工具栏上的调试位置列表中,选择你的应用程序的部署位置。 以下是电话应用程序的列表:

    Windows Phone 应用的部署目标列表

  3. 打开性能和诊断会话。 在**“调试”菜单上,选择“性能和诊断”**(快捷键:Alt + F2)。

  4. 在性能和诊断中心,选择要在会话中运行的一个或多个工具。 将仅显示适用于项目类型和编程语言的工具。 选择诊断工具时,不能选择无法在同一诊断会话中运行的工具。 以下是针对 JavaScript 应用程序的选择:

    选择一个或多个诊断工具

  5. 若要启动诊断会话,请选择**“启动”**。

  6. 运行要为其收集数据的方案。

    在运行会话时,一些工具将在“性能和诊断”页上显示实时数据图。

    在“性能和诊断”页上收集数据

  7. 若要结束诊断会话,请选择**“停止收集”**。

收集诊断数据

添加用户标记以标识诊断数据中的位置 | 设置启动项目 | 设置分析目标 | 选择要在诊断会话中运行的工具 | 启动和停止诊断会话

添加用户标记以标识诊断数据中的位置

可以向分析数据添加“用户标记”以帮助标识时间线标尺中的区域。

时间线中的用户标记

每次执行此方法时,标记将显示为时间线中的橙色三角形。 将鼠标指针悬停在该标记上时,将以工具提示的形式显示消息和时间。 如果有两个或更多个用户标记靠近在一起,则将合并这些标记,而且还将组合工具提示数据。 可以放大时间线来分隔标记。

备注

  • JavaScript 函数计时报告不会显示用户标记。

  • 如果 CPU 使用率工具是诊断会话中使用的唯一工具,则报告不会显示用户标记。

  • 有关更多示例,请参阅 Windows SDK 示例 LoggingSession 示例

向 C#、Visual Basic、C++ 代码添加标记

若要向 C#、Visual Basic、C++ 代码添加标记,请先创建一个 Windows.Foundation.Diagnostics LoggingChannel 对象。 然后在代码中要标记的位置插入对 LoggingChannel.LogMessage 方法的调用。 在调用中使用 LoggingLevel.Information

执行此方法时,用户标记将与消息一起添加到分析数据中。

注释

向代码中添加日志记录通道将面临一些挑战:

**每个打开的日志记录通道都必须具有唯一的名称。**尝试使用与开放通道相同的名称创建新的日志记录通道将导致异常。

若要避免代码中出现重复名称,可使用静态方法(在 VB 中为共享方法)返回具有保证唯一的名称的 LoggingChannel。 下面是使用 Guid 提供唯一名称的示例:

//using Windows.Foundation.Diagnostics
public static LoggingChannel GetLoggingChannel()
{
    var name = Guid.NewGuid().ToString();
    return new LoggingChannel(name);
}
'Imports Windows.Foundation.Diagnostics
Public Shared Function GetLoggingChannel() As LoggingChannel
    Dim Name = Guid.NewGuid().ToString()
    GetLoggingChannel = New LoggingChannel(Name)
End Function
//using namespace Windows::Foundation::Diagnostics;
static LoggingChannel^ MainPage::GetLoggingChannel()
{
    auto name = (ref new Guid())->ToString();
    auto channel = ref new LoggingChannel(name);
    return channel;
}

C# 和 VB:应释放 LoggingChannel 对象

由于 LoggingChannel 对象使用的是系统资源,因此 LoggingChannel 的 C# 和 VB 投影会从 System.IDisposable 接口派生,以使你能够在 CLR 垃圾回收器销毁该对象之前释放资源。 在 C++ 代码中,LoggingChannel 对象超出范围后,将立即销毁该对象并释放资源。 下面是用于向诊断会话文件添加用户标记的模式的示例:

void MyScenario()
{
    var logLevel = LoggingLevel.Information;
    using(var channel = Utils.GetLoggingChannel())
    {
        channel.LogMessage("MyScenario Start", logLevel);
        // scenario code
        channel.LogMessage("MyScenario End", logLevel);
    }
}
Sub MyScenario()
    Dim logLevel = LoggingLevel.Information
    Using channel As LoggingChannel = Utils.GetLoggingChannel()
        channel.LogMessage("MyScenario Start", logLevel)
        'scenario code
        channel.LogMessage("MyScenario End", logLevel)
    End Using
End Sub
// m_channel resources are released when containing 
// object goes out of scope
LoggingChannel^ m_channel = MainPage::GetLoggingChannel();
LoggingLevel m_logLevel = LoggingLevel::Information;

void MyScenario()
{
    m_channel->LogMessage(L"MyScenario Start", m_logLevel);
    //scenario code
    m_channel->LogMessage(L"MyScenario Start", m_logLevel);
}

向 JavaScript 代码添加标记

若要添加用户标记,请在代码中要标记的位置添加以下代码:

if (performance && performance.mark) {
    performance.mark(markDescription);
}

markDescription 是包含要在用户标记工具提示中显示的消息的字符串。

设置启动项目

如果你的解决方案包含多个应用程序项目,请确保将要分析的项目设置为启动项目。 在解决方案资源管理器中,选择该项目并从上下文菜单中选择**“设为启动项目”**。

选择“设为启动项目”

设置部署位置

你可在直接连接到 Visual Studio 计算机的 Windows phone 上或在 Visual Studio 电话仿真程序中运行针对电话应用程序的诊断会话。 你可在 Visual Studio 计算机上、Visual Studio 设备模拟器中或通过网络连接到 Visual Studio 的远程设备或使用 USB 转以太网电缆直接连接到 Visual Studio 计算机的远程设备上运行 Windows 应用商店应用。 可在项目属性的“调试”页上设置部署目标,也可从 Visual Studio 工具栏上的调试位置列表中选择目标。 以下是 Windows 应用商店应用的部署列表:

Windows 应用商店应用的部署目标列表

你在调试位置工具栏上所做的选择将保存到项目属性中。

仅适用于 Windows

  • 在远程 Windows 应用商店设备上运行诊断会话要求在远程目标上安装并运行 Visual Studio 远程工具。 请参阅在远程计算机上从 Visual Studio 运行 Windows 应用商店应用.

  • 如果你在调试位置列表上选择远程计算机时未指定远程设备,请在出现的“远程连接”对话框中指定设备。

    “远程连接”对话框

  • 在指定远程设备目标后,你必须使用项目属性的“调试”页来更改为新设备。

  • 如果你正在使用 USB 转以太网电缆将远程设备与 Visual Studio 计算机连接,请在“远程连接”对话框中 指定远程设备的 I.P. 地址。

设置分析目标

除了从 Visual Studio 项目启动你的应用程序之外,还可在备用目标上运行诊断会话。 例如,你可能希望诊断从 Windows 应用商店安装的应用程序版本的性能问题。

选择诊断工具分析目标

仅适用于 Windows

可以启动设备上已安装的 Windows 应用商店应用,也可将诊断工具附加到正在运行的 Windows 应用商店应用。 如果你选择“正在运行的应用程序”或“已安装的应用程序”,请从在指定的部署目标上发现应用程序的列表中选择应用程序。

选择要诊断的正在运行或已安装的应用

仅适用于 Windows Phone

如果你选择 Internet Explorer,请指定 URL,并且你可以更改电话部署目标。

指定要在 Internet Explorer 中显示的 URL

选择要在诊断会话中运行的工具

在性能和诊断中心,选择要在诊断会话中运行的一个或多个工具。 将仅显示适用于项目类型和编程的工具。 选择诊断工具时,不能选择无法在同一诊断会话中运行的工具。 以下是针对 JavaScript 应用程序的选择:

启动和停止诊断会话

若要启动诊断会话,请选择“启动”。

若要结束诊断会话并开始数据分析,请选择此页底部的**“停止收集”**。

打开诊断会话文件

在诊断会话中停止收集数据后,将立即分析数据并在性能和诊断报告中显示数据。

还可从性能和诊断中心上的最近打开的列表打开已保存的 .diagnosis 会话文件。

打开保存的诊断会话文件

选择性能和诊断中心顶部的“显示”或“隐藏”按钮以展开或折叠最近使用的文件列表。

性能和诊断报告

“性能和诊断”数据页

步骤 1

时间线显示分析会话的长度、应用程序生命周期激活事件以及用户标记。

步骤 2

你可以通过拖动蓝色条选择时间线的一个区域,将报告限制到这一部分时间线内。

步骤 3

一个工具可显示一个或多个主关系图。 如果你的诊断会话是使用多个工具创建的,则将显示所有主关系图。

步骤 4

可以折叠和展开各个关系图。

步骤 5

当你的数据包含来自多个工具的信息时,工具的详细信息将收集到选项卡的下方。

步骤 6

一个工具可具有一个或多个详细信息视图。 视图将按时间线的选定区域进行筛选。

疑难解答

已删除的诊断事件。报告中的某些信息可能丢失或不准确

性能和诊断工具中的数据控制器可能占用大量内存和 CPU。 当数据控制器无法记录所有诊断事件时,它在“性能和诊断”页顶部的信息栏中显示该消息。 报告中的某些数据可能丢失或不准确。

若要解决此问题,请尝试使用这些步骤释放计算机上的资源,然后重新运行诊断会话:

  1. 关闭不属于诊断会话的其他应用。

  2. 简化你的方案以便收集较少的数据。

  3. 在单个会话中使用较少的诊断工具。

请参见

其他资源

性能(Windows 应用商店应用)

Windows SDK LoggingSession 示例