69

我已将我的团队使用的库放入从 TeamCity 部署到网络文件夹的 nuget 包中。我无法调试到这段代码!SymbolSource 是我读过的一种解决方案,但我更愿意找到某种方法来直接从 TeamCity 访问 .pdb/source 文件。有谁知道如何做到这一点?

编辑。 当我签'Include Symbols and Source'入 Nuget Pack 构建步骤时,除了网络文件夹中的 .nupkg 文件之外,TeamCity 还会创建一个 .Symbol.nupkg。.Symbol.nupkg 包含 src 和 .pdb 文件。

编辑。 我取消选中'Include Symbols and Source'TeamCity 并将以下内容添加到我的 nuspec 文件中:

  <files>
    <file src="..\MyLibrary\bin\release\MyLibrary.dll" target="lib\net40" />
    <file src="..\MyLibrary\bin\release\MyLibrary.pdb" target="lib\net40" />
    <file src="..\MyLibrary\*.cs" target="src" />
    <file src="..\MyLibrary\**\*.cs" target="src" />
  </files>

这在 nuget 包中添加了我的库的 dll、pdb 和源文件,并且没有生成我认为只有符号服务器才需要的 .Symbols 文件。

4

10 回答 10

73

传统方法

  1. 将 pdb 放在 dll 旁边的 NuGet 包中。
  2. 将源代码添加到引用包的解决方案的调试源文件中。

这意味着您将能够单步执行代码并查看异常,但您可能必须在磁盘上找到一个文件并打开它,然后才能设置断点。显然,您需要注意源的版本是否正确。

步骤的更多细节

如果您当前在没有 Nuspec 的情况下打包,则需要创建一个 Nuspec,然后将 pdb 添加到 lib 文件夹中的文件列表中“NuGet 规范”可能是生成NuGet中定义的初始规范的有用命令文档。然后确保 Team City Nuget Pack 步骤引用了您的新 nuspec。

有关步骤 2 的更多详细信息

打开解决方案后,右键单击解决方案,选择属性...通用属性...调试源文件,然后添加相关二进制引用的根源目录。或查看MSDN。请注意,调试时无法打开解决方案属性。

还没有达到断点?

尝试从 Tools->Options 禁用它: 禁用完全源匹配


公共或私人回购的现代方式

为确保源代码的确切版本可用,请在构建时将其嵌入。

从 Visual Studio 2017 15.5+ 开始,您可以添加 EmbedAllSources 属性:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <EmbedAllSources>true</EmbedAllSources>

公共回购的现代方式

为了保持你的 nuget 和库的大小,你可以使用sourcelink 包

它会生成一个 pdb,将调试器定向到来自您的 VCS 提供程序(例如 GitHub、BitBucket)的文件的正确版本。

于 2014-02-21T00:05:59.727 回答
29

最新版本的 dotPeek(免费!)可以充当符号服务器并即时生成 pdb 文件。这使我能够调试通过 teamcity 提供的 dll。

在这里下载:

http://blog.jetbrains.com/dotnet/2014/04/09/introducing-dotpeek-1-2-early-access-program/

有关如何在此处进行设置的说明。

https://web.archive.org/web/20160220163146/http://confluence.jetbrains.com/display/NETCOM/dotPeek+Symbol+Server+and+PDB+Generation

于 2014-05-27T16:10:02.293 回答
8

您当然可以设置和配置自己的符号服务器,但这可能是最简单的...

  1. 下载并安装 Inedo 的ProGet
  2. 在目标 Feed 上启用符号服务
  3. 将包从 TeamCity 发布到 ProGet 源
  4. 使用 ProGet 作为您的主要提要源(因为它可以聚合多个提要,包括 nuget.org)

所有这些都可以通过 ProGet 的免费版来完成。


免责声明——我的日常工作是在Inedo

于 2014-02-18T17:27:22.907 回答
6

在您的.nuspec(直接在 下<package>):

<files>
  <file src="bin\$configuration$\$id$.pdb" target="lib\net451\" />
</files>

(更改net451为您正在编译的平台)

于 2016-01-22T15:06:33.057 回答
3

如果您有软件包的源代码,那么万无一失(但可能很费力)的方法是:

  1. 将包的源代码添加到您的解决方案中(右键单击解决方案 -> 添加现有项目)
  2. 浏览解决方案中的所有项目并删除对库的 NuGet 引用(即打开每个项目下的 References 文件夹并删除对包的引用。)然后,在解决方案中添加对 NuGet 包项目的引用。(即右键单击引用,添加引用,选择项目并勾选项目框)

当我想在 NuGet 包中调试的方法被框架而不是我的代码调用时,我不得不这样做,因此我无法进入它。(在我的例子中,该方法是一个 ASP.NET DelegatingHandler)。

完成后,您需要通过源代码管理撤消所有更改,以便正确引用 NuGet 包。

于 2016-02-18T15:50:30.203 回答
3

我找到了一种超级简单的方法来做到这一点,我在这里写过博客:

https://mattfear.com/2017/11/29/speed-up-development-in-a-nuget-package-centric-solution/

这仅在您使用新的 .NET Core 样式 .csproj 时有效<PackageReference>(在 .NET Core 或 .NET Framework 上)。

这再次假设您可以访问 NuGet 包的源代码。

  1. 在本地计算机上构建和编译 NuGet 包
  2. 将您刚刚编译的 .dll 复制到本地 NuGet 包源文件夹(在我的机器上,这是C:\Users\matt\.nuget\packages\),覆盖现有的 NuGet 包 .dll。

就是这样!您应该能够在调试时单步执行该包。不要乱用 .pdbs 或源服务器。这大大加快了我的开发周期。

于 2017-12-05T12:56:35.293 回答
2

由于最初发布了这个问题,Jetbrains 已经写了一篇关于如何完成这个问题的完整博客文章。步骤可以概括为:

如果您使用 Nuget Package 构建步骤,您可以选中“包含符号和源”以输出.symbol.nupkg包含 PDB 的内容。根据符号文件索引器是否足够智能以查看此文件,您可能需要更改文件扩展名才能正常工作。

此处提供了完整的详细信息: https ://blog.jetbrains.com/teamcity/2015/02/setting-up-teamcity-as-symbol-and-source-server/

于 2015-11-11T20:15:31.597 回答
2

这是我发现的工作,但可能不需要所有步骤......

注意:这不允许您同时调试 nuget 包或安装它的解决方案。

  1. 以管理员身份运行 Visual Studio
  2. 打开并启动主机应用程序(您安装 Nuget 包的应用程序)而不进行调试(Ctrl + F5)
  3. 在Nuget包解决方案中,确保Tools > Options > Debugging > General > "Require source files to exactly match the original version"未选中该选项。
  4. 确保"Enable just my code"未选中_
  5. Tools > Options > Debugging > Symbols在指向 Nuget 包的源目录中添加一个新文件夹。(您从字面上输入文件夹路径,见下图)
  6. 点击Debug > Attach to Process...
  7. 查找iisexpress(可能有多个,它不会对所有人造成任何伤害)

符号源位置的屏幕截图

于 2016-07-25T22:29:16.340 回答
0

如果您的代码位于公共 Git 存储库中,或者至少在您的网络中,无需身份验证即可访问,那么 GitLink 将是一个选项:

https://github.com/GitTools/GitLink

GitLink 通过将 PDB 更改为指向 Git 服务器来淘汰符号服务器。但是,如前所述,这使得 Git 存储库必须是公开的——直到现在,在访问私有存储库时还没有“正确”的方式来进行身份验证。

于 2017-03-22T15:31:56.620 回答
0

微软现在已经在https://github.com/dotnet/sourcelink/集成了 SourceLink NuGet 包, 如果 NuGet 包的发布者设置了它,它允许在调试时按需下载源代码。

于 2019-10-25T20:41:50.110 回答