部署之后设置发行版本以诊断问题

要在使用 IntelliTrace 部署后诊断 ASP.NET Web 应用中的问题,请加入发行版本信息,以便 Visual Studio 自动查找调试 IntelliTrace 日志所需的正确源文件及符号文件。

如果正使用 Microsoft 监视代理控制 IntelliTrace,则你还需在 Web 服务器上设置应用程序性能监视。 这将在应用运行时记录诊断事件,并将这些事件保存到 IntelliTrace 日志文件。 然后你可以在 Visual Studio Ultimate 中查看事件,转到发生事件的代码,查看在该时间点记录的值,然后在已运行的代码中向前或向后移动。 在找到并解决问题后,重复生成、发布和监控发布这一循环,以便可以更早更快地解决将来的潜在问题。

代码、生成、发布、监视、诊断、修复

你将需要:

  • 用于设置生成的 Visual Studio 2013 或者 Team Foundation Server 2013、2012 或 2010

  • 用于监视应用和记录诊断数据的 Microsoft Monitoring Agent

  • 用于查看诊断数据并使用 IntelliTrace 调试代码的 Visual Studio Ultimate 2013

步骤 1:在发布中包含生成数据

设置生成过程以为你的 Web 项目创建生成清单(BuildInfo.config 文件)并在发布中包含此清单。 此清单包含有关项目、源代码管理和用于创建特定生成的生成系统的信息。 在你打开 IntelliTrace 日志以查看记录的事件时,此信息可帮助 Visual Studio 查找匹配的源和符号。

使用 Team Foundation Server 为自动化生成创建生成清单

无论你使用 Team Foundation 版本控制还是 Git,请按照这些步骤进行操作。

Team Foundation Server 2013

设置生成定义以将源、生成和符号的位置添加到生成清单(BuildInfo.config 文件)。 Team Foundation Build 自动创建此文件并将其放置在项目的输出文件夹中。

  1. 编辑生成定义或创建新的生成定义。

    在 TFS 2013 中查看生成定义

  2. 选择默认模板 (TfvcTemplate.12.xaml) 或自己的自定义模板。

    选择生成过程模板 - TFS 2013

  3. 指定保存符号 (PDB) 文件的位置,以便自动为你的源编制索引。

    如果使用自定义模板,请确保该模板具有用于为源编制索引的活动。 之后你将添加 MSBuild 参数以指定保存符号文件的位置。

    在生成定义 TFS 2013 中设置符号路径

    有关符号的详细信息,请参阅发布符号数据

  4. 添加此 MSBuild 参数以在生成清单文件中包含 TFS 和符号位置:

    /p:IncludeServerNameInBuildInfo=True

    任何可访问你的 Web 服务器的人都可以在生成清单中看见这些位置。 请确保你的源服务器是安全的。

  5. 如果使用自定义模板,请添加此 MSBuild 参数,以指定保存符号文件的位置:

    /p:BuildSymbolStorePath=<符号的路径>

    在生成定义 TFS 2013 中包括生成服务器信息

    将这些行添加到你的 Web 项目文件(.csproj、.vbproj)中:

    <!-- Import the targets file. Change the folder location as necessary. -->
       <Import Project=""$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\BuildInfo\Microsoft.VisualStudio.ReleaseManagement.BuildInfo.targets" />
    
  6. 运行新的生成。

**步骤 2:**发布你的应用

Team Foundation Server 2012 或 2010

若要为项目自动创建生成清单(BuildInfo.config 文件)并将其置于你的项目的输出文件夹中,请执行以下步骤。 此文件在输出文件夹中显示为“ProjectName.BuildInfo.config”,但是在你发布应用后将在部署文件夹中重命名为“BuildInfo.config”。

  1. 在你的 Team Foundation Build 服务器上安装 Visual Studio 2013(任意版本)。

  2. 在你的生成定义中,指定保存符号的位置,以便自动为你的源编制索引。

    如果使用自定义模板,请确保该模板具有用于为源编制索引的活动。

  3. 将这些 MSBuild 参数添加到你的生成定义:

    • /p:VisualStudioVersion=12.0

    • /p:MSBuildAssemblyVersion=12.0

    • /tv:12.0

    • /p:IncludeServerNameInBuildInfo=True

    • /p:BuildSymbolStorePath=<符号的路径>

  4. 运行新的生成。

**步骤 2:**发布你的应用

使用 Visual Studio 2013 创建手动生成的生成清单

若要为项目自动创建生成清单(BuildInfo.config 文件)并将其置于你的项目的输出文件夹中,请执行以下步骤。 此文件在输出文件夹中显示为“ProjectName.BuildInfo.config”,但是在你发布应用后将在部署文件夹中重命名为“BuildInfo.config”。

  1. 在**“解决方案资源管理器”**中,卸载 Web 项目。

  2. 打开项目文件(.csproj、.vbproj)。 添加这些行:

    <!-- **************************************************** -->
    <!-- Build info -->
    <PropertyGroup>
       <!-- Generate the BuildInfo.config file -->
       <GenerateBuildInfoConfigFile>True</GenerateBuildInfoConfigFile>
       <!-- Include server name in build info --> 
       <IncludeServerNameInBuildInfo>True</IncludeServerNameInBuildInfo> 
       <!-- Include the symbols path so Visual Studio can find the matching deployed code when you start debugging. -->
       <BuildSymbolStorePath><path to symbols></BuildSymbolStorePath>
    </PropertyGroup>
    <!-- **************************************************** -->
    
  3. 签入更新的项目文件。

  4. 运行新的生成。

**步骤 2:**发布你的应用

使用 MSBuild.exe 创建手动生成的生成清单

运行生成时添加这些生成参数:

/p:GenerateBuildInfoConfigFile=True

/p:IncludeServerNameInBuildInfo=True

/p:BuildSymbolStorePath=<符号的路径>

步骤 2:发布你的应用

如果使用生成过程中创建的 Web.Deploy 包来部署你的应用,则生成清单从“ProjectName.BuildInfo.config”自动重命名为“BuildInfo.config”,并在 Web 服务器上与应用的 Web.config 文件一起放在相同的文件夹中。

如果你使用其他方法部署应用,请确保生成清单从“ProjectName.BuildInfo.config”重命名为“BuildInfo.config”,并且在 Web 服务器上与应用的 Web.config 文件一起放在相同的文件夹中。

步骤 3:监视你的应用程序

在 Web 服务器上设置应用程序性能监视,以便可以监视应用程序中的问题、记录诊断事件并将这些事件保存到 IntelliTrace 日志文件中。 请参见监视你的发布的部署问题

步骤 4:查找问题

你的开发计算机或另一台计算机上将需要 Visual Studio Ultimate 2013,以查看记录的事件并使用 IntelliTrace 调试代码。 你还可以使用诸如 CodeLens、调试器映射和代码映射等工具帮助你诊断问题。

打开 IntelliTrace 日志和匹配的解决方案

  1. 从 Visual Studio Ultimate 2013 中打开 IntelliTrace 日志(.iTrace 文件)。 或者如果你的同一计算机上具有 Visual Studio Ultimate 2013,则只需双击该文件。

  2. 如果该项目没有作为解决方案的一部分而生成,请选择**“打开解决方案”**来让 Visual Studio 自动打开匹配的解决方案或项目。 IntelliTrace 日志缺少有关部署的应用程序的信息。

    Visual Studio 在打开匹配的解决方案或项目时自动搁置挂起的更改。 若要获取有关搁置集的更多详细信息,请在**“输出”窗口或“团队资源管理器”**中查找。

    在进行任何更改之前,请确认你的源代码正确。 如果你使用分支,你可能在不同于 Visual Studio 找到匹配源的分支中工作,例如你的发布分支。

    从 IntelliTrace 日志打开解决方案

    如果你有映射到此解决方案或项目的现有解决方法,Visual Studio 会选择用于放置找到的源的工作区。

    从源代码管理打开,到映射的工作区

    否则,请选择其他工作区或创建新的工作区。 Visual Studio 将整个分支映射到此工作区。

    从源代码管理打开 - 创建新的工作区

    若要创建具有特定映射的工作区或不是计算机名称的名称,请选择**“管理”**。

    为什么 Visual Studio 提示我选中的工作区域是不合格的?

    为什么在选择团队集合或不同的集合前,无法继续?

诊断性能问题

  1. 在**“性能冲突”**下,查看记录的性能事件、其总执行时间以及其他事件信息。 然后,深入查看在特定性能事件期间调用的方法。

    查看性能事件详细信息

    也可以直接双击事件。

  2. 在事件页上,查看这些调用的执行时间。 在执行树中查找缓慢调用。

    当你有多个调用(嵌套调用或其他调用)时,最慢的调用将显示在它们自己的部分中。

    展开调用以查看在该时间点记录的所有嵌套调用和值。 然后,从该调用开始调试。

    从方法调用开始调试

    你也可以双击调用。

    如果方法在应用程序代码中,Visual Studio 将转到该方法。

    从性能事件转到应用程序代码

    现在你可以查看其他记录的值和调用堆栈、单步执行代码,或者使用**“IntelliTrace”**窗口在此性能事件期间调用的其他方法之间“及时”前后移动IntelliTrace 日志中所有这些其他事件和信息是什么? 我还能在此处执行什么操作? 要了解有关性能事件的详细信息?

诊断异常

我还能在此处执行什么操作?

问题解答

问:为何在我的发布中包含有关我的项目、源代码管理、生成和符号的信息?

Visual Studio 使用此信息针对你尝试调试的发布查找匹配的解决方案和源。 在你打开 IntelliTrace 日志并选择要开始调试的事件后,Visual Studio 使用符号查找并向你显示发生事件的代码。 然后你可以查看记录的值,并在代码的执行中向前或向后移动。

如果你使用 TFS,而且此信息不在生成清单(BuildInfo.config 文件)中,Visual Studio 将在当前连接的 TFS 上查找匹配的源和符号。 如果 Visual Studio 找不到正确的 TFS 或匹配的源,将提示你选择不同的 TFS。

问:IntelliTrace 日志缺少有关部署的应用程序的信息。为何发生这种情况?我该怎么办?

当你从开发计算机部署或在部署期间未连接到 TFS 时,可能发生此情况。

  1. 转到项目的部署文件夹。

  2. 查找并打开生成清单(BuildInfo.config 文件)。

  3. 确保此文件包含必需的信息:

字段

指定

ProjectName

Visual Studio 中你的项目的名称。 例如:

<ProjectName>FabrikamFiber.Extranet.Web</ProjectName>

SourceControl

有关你的源代码管理系统以及以下必需属性的信息:

  • TFS

    • ProjectCollectionUri:用于 Team Foundation Server 和项目集合的 URI

    • ProjectItemSpec:应用的项目文件(.csproj 或 .vbproj)的路径

    • ProjectVersionSpec:项目的版本

    例如:

    <SourceControl type="TFS">
       <TfsSourceControl>
          <ProjectCollectionUri>http://fabrikamfiber:8080/tfs/FabrikamFiber</ProjectCollectionUri>
          <ProjectItemSpec>$/WorkInProgress/FabrikamFiber/FabrikamFiber.CallCenter/FabrikamFiber.Web/FabrikamFiber.Web.csproj</ProjectItemSpec>
          <ProjectVersionSpec>LFabrikamFiber_BuildAndPublish_20130813@$/WorkInProgress</ProjectVersionSpec>
       </TfsSourceControl>
    </SourceControl>
  • Git

    • GitSourceControlGitSourceControl 架构的位置

    • RepositoryUrl:用于 Team Foundation Server、项目集合和 Git 存储库的 URI

    • ProjectPath:应用的项目文件(.csproj 或 .vbproj)的路径

    • CommitId:你的提交的 ID

    例如:

    <SourceControl type="Git"> 
       <GitSourceControl xmlns="https://schemas.microsoft.com/visualstudio/deploymentevent_git/2013/09">
          <RepositoryUrl>http://gittf:8080/tfs/defaultcollection/_git/FabrikamFiber</RepositoryUrl>
          <ProjectPath>/FabrikamFiber.CallCenter/FabrikamFiber.Web/FabrikamFiber.Web.csproj</ProjectPath>
          <CommitId>50662c96502dddaae5cd5ced962d9f14ec5bc64d</CommitId>
       </GitSourceControl>
    </SourceControl>

生成

有关生成系统("TeamBuild" 或 "MSBuild")以及以下所需属性的信息:

  • BuildLabel(对于 TeamBuild):生成名称和号码。 此标签也用作部署事件的名称。 有关生成号码的详细信息,请参见使用生成号为已完成的生成指定有意义的名称

  • SymbolPath(推荐):你的符号(PDB 文件)位置的 URI 列表,采用分号分隔。 这些 URI 可以是 URL 或 UNC。 它使 Visual Studio 更易于查找匹配的符号以帮助你进行调试。

  • BuildReportUrl(对于 TeamBuild):TFS 中的生成报告的位置

  • BuildId(对于 TeamBuild):TFS 中生成详细信息的 URI。 此 URI 也用作部署事件的 ID。 如果不使用 TeamBuild,则它必须是唯一的 ID。

  • BuiltSolution:Visual Studio 用于查找和打开匹配的解决方案的解决方案文件的路径。 这是 SolutionPath MsBuild 属性的内容。

例如:

  • TFS

    <Build type="TeamBuild">
       <MsBuild>
          <BuildLabel kind="label">FabrikamFiber_BuildAndPublish_20130813.1</BuildLabel>
          <SymbolPath>\\fabrikamfiber\FabrikamFiber.CallCenter\Symbols</SymbolPath>
          <BuildReportUrl kind="informative, url" url="http://fabrikamfiber:8080/tfs/FabrikamFiber/_releasePipeline/FindRelease?buildUri=fabrikamfiber%3a%2f%2f%2fBuild%2fBuild%2f448">Build Report Url</BuildReportUrl>
          <BuildId kind="id">1c4444d2-518d-4673-a590-dce2773c7744,fabrikamfiber:///Build/Build/448</BuildId>
          <BuiltSolution>$/WorkInProgress/FabrikamFiber/FabrikamFiber.CallCenter/FabrikamFiber.CallCenter.sln</BuiltSolution>
       </MsBuild>
    </Build>
  • Git

    <Build type="MSBuild"> 
       <MSBuild>
          <SymbolPath>\\gittf\FabrikamFiber.CallCenter\Symbols</SymbolPath>
          <BuiltSolution>/FabrikamFiber.CallCenter/FabrikamFiber.CallCenter.sln</BuiltSolution>
       </MSBuild>
    </Build>

问:为什么 Visual Studio 提示我选中的工作区域是不合格的?

答:选定的工作区域没有源代码管理文件夹和本地文件夹之间的任何映射。 若要为此工作区创建映射,请选择“管理”。 否则,请选择已映射的工作区或创建新的工作区。

从没有映射工作区的源代码管理打开

问:为什么在选择团队集合或不同的集合前,无法继续?

**答:**这种情况可能是由于以下原因导致的:

  • Visual Studio 未连接到 TFS。

    从源代码管理打开 - 未连接

  • Visual Studio 未在你的当前团队集合中找到解决方案或项目。

    当生成清单文件 (<ProjectName>.BuildInfo.config) 未指定 Visual Studio 可在何处找到匹配的源时,Visual Studio 将使用你当前连接的 TFS 查找匹配的解决方案或项目。 如果当前的团队集合没有匹配的源,Visual Studio 将会提示你连接到不同的团队集合。

  • Visual Studio 未在集合中找到由生成清单文件 (<ProjectName>.BuildInfo.config) 指定的解决方案或项目。

    指定的 TFS 可能不再具有匹配的源,甚至不存在(可能是因为你已迁移到新的 TFS)。 如果指定的 TFS 不存在,Visual Studio 在一分钟后可能会超时,然后会提示你连接到不同的集合。 若要继续,请连接到正确的 TFS 服务器。

    从源代码管理打开 - 已迁移

问:什么是工作区?

**答:**你的工作区存储源的副本,因此在签入工作之前,你可以对其进行单独开发和测试。 如果尚未具备专门映射到找到的解决方案或项目的工作区,那么 Visual Studio 会提示你选择一个可用的工作区,或以你的计算机名称作为默认工作区名称创建新的工作区。

问:为什么我收到了有关不受信任的符号的消息?

使用不受信任的符号路径进行调试?

**答:**当受信任的符号路径列表中不包含生成清单文件 (<ProjectName>.BuildInfo.config) 中的符号路径时,会出现此消息。 你可将路径添加到调试器选项中的符号路径列表。