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

6
我有一个构建服务器用于构建内部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上查找源代码?这不应该存储在符号服务器的PDB中吗?
1个回答

3
很可能发生的情况是,您添加到NuGet软件包中的PDB文件不是索引文件,而是由MSBuild构建的原始文件。
您是否在使用TeamCity?您只有一个构建配置吗?如果是这样,那么这肯定是原因。
TeamCity会索引任何作为Artifacts创建的PDB文件(假设您安装了plugin插件)。问题在于:索引您的PDB意味着修改您的PDB。修改后的PDB将在构建Artifacts中找到。由于在构建过程中没有任何时间点可用于修改(索引)后的PDB,因此必须将其拆分为两个配置。

构建配置

创建名为“Build”的构建配置并编辑配置设置。查看常规设置。Artifact Paths列出了将从构建输出的文件。
这个文本框列出了一系列规则:将与“这个”模式匹配的文件复制到位于“那个”路径上的构件中。您想添加规则,将您的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

执行此构建并验证您获得了预期的工件。检查构建日志,并确保其中包含“索引符号源”和“发布符号源”步骤。然后在成功构建的“Artifacts”选项卡上单击,应列出这六个文件,并位于正确的目录结构中。
NuGet配置
由于TeamCity在索引时会修改您的PDB,因此无法在Build配置中生成NuGet软件包。您需要第二个配置。我们将其称为“NuGet”。
创建一个名为NuGet的新构建配置并编辑配置设置。查看依赖项,并添加一个新的Artifact Dependence。这应该依赖于Build配置并从最后一个成功的构建获取工件。带入我们从Build配置输出的所有文件。
**/*

创建一个名为“NuGet Install”的构建步骤。这应该是一个“NuGet Install”步骤,用于恢复所有依赖项。输入*.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>

嗨,Michael,感谢你提供深入的答案。我们使用VSTS来构建我们的工件,但是你可能有一个关于PDB被修改的观点。我会在这个前提下进行调查。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接