调试Nuget软件包时找不到符号源代码

时间:2018-08-21 13:05:37

标签: c# nuget symbols symbol-server

我有一个构建服务器,用于构建内部Nuget软件包。当我使用该程序包并尝试进入一种方法时,它不起作用。

所有符号都发布到我的符号服务器上,并且我已在VS设置中启用了此符号。

如果检查“模块”窗口,则会看到Nuget DLL在那里,并且已从符号服务器为其加载了正确的符号。

但是,当我尝试进入代码时,它会跳过该方法。如果我使用调用堆栈专门查看该行代码,则显示“找不到ClientBase.cs”。如果展开“源搜索信息”,则会看到以下内容:

  

找到'C:\ Build的源   Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs”。 (没有校验和。)

     

文件'C:\ Build   Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs'   不存在。

     

在脚本文档中查找'C:\ Build   Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs'...

     

在项目中查找'C:\ Build   Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs”。

     

在项目中找不到文件。

     

使用来源查找来源   服务器...

     

活动解决方案的调试源文件设置   指示调试器将不要求用户查找文件:   C:\ Build   Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs。

     

调试器无法找到源文件'C:\ Build   Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs'。

为什么要在Build Agent上寻找源代码?不应将其存储在Symbol Server的PDB中吗?

1 个答案:

答案 0 :(得分:3)

可能发生的是您添加到NuGet软件包中的PDB文件不是索引文件。这是MSBuild构建的原始文件。

您在使用TeamCity吗?您只有一个构建配置吗?如果是这样,那么肯定是这种情况。

TeamCity会将所有作为工件创建的PDB文件编入索引(假设您已安装plugin)。这有个要点:为PDB编制索引意味着修改您的PDB。修改后的PDB将在构建工件中找到。由于在构建过程中没有必要提供经过修改的(索引的)PDB,因此您必须将其分为两种配置。

构建配置

创建一个名为Build的构建配置,然后编辑配置设置。查看常规设置。 Artifact Paths列出了将从构建中输出的文件。

此文本框列出了一系列规则:将符合 this 模式的文件复制到 that 路径中的工件。您想要添加规则以使用正确的相对结构将dll,pdb,sln,csproj,nuspec和packages.config文件复制到工件。您应该以如下形式结束:

MyProject.sln
MyProject/bin/Release/MyProject.pdb => MyProject/bin/Release
MyProject/bin/Release/MyProject.dll => MyProject/bin/Release
MyProject/MyProject.csproj => MyProject
MyProject/MyProject.nuspec => MyProject
MyProject/packages.config => MyProject

运行此构建,并验证您是否获得了预期的工件。检查构建日志,并确保它包括步骤“索引符号源”和“发布符号源”。然后,单击成功构建的“工件”选项卡,应列出这六个文件并采用正确的目录结构。

NuGet配置

由于TeamCity在对PDB进行索引时会对其进行修改,因此无法在Build配置中生成NuGet软件包。您需要第二个配置。我们将其称为“ NuGet”。

创建一个名为NuGet的新构建配置,然后编辑配置设置。查看依赖关系,并添加一个新的工件依赖关系。这应该取决于Build配置并从上一次成功的构建中获取构件。引入我们从Build配置输出的所有文件:

**/*

创建一个名为“ NuGet Install”的构建步骤。这应该是还原所有依赖项的“ NuGet安装”步骤。输入您的* .sln文件的名称。

创建第二个构建步骤,称为“ NuGet Pack”。这应该是一个“ NuGet Pack”步骤。规范文件实际上是您的csproj,而不是您的nuspec!只需提供完整路径,例如MyProject / MyProject.csproj。将输出目录设置为“ Packages”,然后选中“发布创建的软件包以构建工件”。

NuGet规范

要完成图片,您需要确保* .nuspec文件包含PDB文件。您可以通过将DLL和PDB列为* .nuspec中的文件来完成此操作。在下面添加一个部分(不在其内部)并列出这两个文件。它应该看起来像这样:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <copyright>Copyright 2018</copyright>
  </metadata>
  <files>
    <file src="bin\Release\MyProject.dll" target="lib\net461" />
    <file src="bin\Release\MyProject.pdb" target="lib\net461" />
  </files>
</package>