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

C# 调试Nuget包时找不到符号源代码,c#,nuget,symbols,symbol-server,C#,Nuget,Symbols,Symbol Server,我有一个构建服务器,它构建一个内部Nuget包。当我使用那个软件包并尝试逐步进入一个方法时,它不起作用 所有符号都发布到我的符号服务器,我已在我的VS设置中启用了此功能 如果我检查“模块”窗口,我会看到Nuget DLL在那里,并且从符号服务器为其加载了正确的符号 然而,当我尝试单步执行代码时,它会跳过方法。如果我使用调用堆栈专门查看该行代码,它会显示“ClientBase.cs not found”。如果展开“源搜索信息”,我会看到: 正在查找“C:\Build”的源 Agent\vsts-A

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

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

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

然而,当我尝试单步执行代码时,它会跳过方法。如果我使用调用堆栈专门查看该行代码,它会显示“ClientBase.cs not found”。如果展开“源搜索信息”,我会看到:

正在查找“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\u work\1\s\ClientsShared\Class\ClientBase.cs

调试器找不到源文件“C:\Build” Agent\vsts-Agent-win7-x64-2.117.1_work\1\s\ClientsShared\Class\ClientBase.cs'


为什么要在构建代理上查找源代码?是否不应将其存储在Symbol服务器上的PDB中?

可能发生的情况是,添加到NuGet包中的PDB文件不是索引文件。它是由MSBuild生成的原始文件

你在用TeamCity吗?您是否只有一个生成配置?如果是这样,那么情况肯定是这样

TeamCity为创建为工件的任何PDB文件编制索引(假设已安装)。这里有一个陷阱:索引您的PDB意味着修改您的PDB。修改后的PDB将在构建工件中找到。由于在构建过程中,修改(索引)的PDB没有可用性,因此必须将其分为两种配置

构建配置 创建名为build的生成配置并编辑配置设置。查看常规设置。工件路径列出将从构建输出的文件

此文本框列出一系列规则:将匹配此模式的文件复制到该路径上的工件。您希望添加规则,以便使用正确的相对结构将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
<?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>
运行此构建并验证您是否获得了预期的工件。检查生成日志,确保其中包括“索引符号源”和“发布符号源”步骤。然后单击成功构建的Artifacts选项卡,这六个文件应该在正确的目录结构中列出

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

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

**/*
创建一个名为“NuGet安装”的构建步骤。这应该是一个“NuGet安装”步骤,用于恢复所有依赖项。输入*.sln文件的名称

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

NuGet规范 要完成图片,您需要确保*.nuspec文件包含PDB文件。您可以通过将DLL和PDB列为*.nuspec中的文件来实现这一点。在下面添加一个部分(不在其中),并列出这两个文件。它应该是这样的:

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
<?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>

$id$
$version$
$title$
$author$
$author$
假的
$description$
版权所有2018

嗨,迈克尔,谢谢你的深入回答。我们使用VST来构建我们的人工制品,但您可能对PDB进行了修改。我会考虑到这一点进行调查。