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



我有一个构建服务器来构建内部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:\生成" 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:\生成" Agent\vsts-agent-win7-x64-2.117.1_work\1\s\ClientsShared\Class\ClientBase.cs'.

为什么要在生成代理上查找源代码?这不应该存储在符号服务器上的 PDB 中吗?

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

您使用的是团队城市吗?您是否只有一个构建配置?如果是这样,那么情况肯定是这样。

TeamCity 索引创建为工件的任何 PDB 文件(假设已安装插件(。这里有一个问题:索引 PDB 意味着修改PDB。修改后的 PDB 将在生成项目中找到。由于在生成过程中修改(索引(的 PDB 不可用,因此必须将其拆分为两个配置。

构建配置

创建名为"生成"的生成配置并编辑配置设置。查看常规设置。项目路径列出了将从生成输出的文件。

此文本框列出了一系列规则:将与这种模式匹配的文件复制到路径上的工件。您希望添加规则以使用正确的相对结构将 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 时会修改 PDB,因此无法在生成配置中生成 NuGet 包。您需要第二个配置。这个我们称之为"NuGet"。

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

**/*

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

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

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="binReleaseMyProject.dll" target="libnet461" />
<file src="binReleaseMyProject.pdb" target="libnet461" />
</files>
</package>

最新更新