ChatGPT解决这个技术问题 Extra ChatGPT

如何调试从 TeamCity 部署的我的 nuget 包?

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

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

编辑。我取消选中 TeamCity 上的 'Include Symbols and Source' 并将以下内容添加到我的 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 文件。


G
Graham

传统方法

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

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

步骤的更多细节

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

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

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

还没有达到断点?

https://i.stack.imgur.com/1vEia.png

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

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

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

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

公共回购的现代方式

要使您的 nuget 和库大小保持较小,您可以使用 sourcelink package

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


不确定这是否是一个错误,但在 VS2015 中尝试此操作的任何人单击“调试源文件”都不会显示正确的窗口,它似乎显示了配置管理器。
@Choco Smith 我有同样的问题。右键单击解决方案文件,Common Properties->Debug Source Files 在 VS 2015 中显示 Configuration Manager 窗口。你知道如何在 VS2015 中显示 Debug Source Files 窗口吗?
在 VS2015 中一直对我很好。我今天在 VS Enterprise 2015 版本 14.0.24720.00 上使用了它。如果它不只是一个流氓扩展弄乱了你的菜单,也许会造成 Microsoft Connect 问题? connect.microsoft.com/VisualStudio/MSNetNative
H
Henrik Stenbæk

最新版本的 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


我希望我能再次投票给你。我今年早些时候来到这里并忘记了这一点,现在我需要做同样的事情并且。中提琴..你的答案很震撼!
您使用了存档链接。很棒的答案。
K
Karl Harnagy

您当然可以set-up & configure your own symbol server,但这可能是最简单的...

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

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

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


如果我已经有了 .Symbol.nupkg 文件,为什么还需要“符号服务器”? Visual Studio 不能直接读取这个文件吗?
@anthonybell 哦,绝对不是! “.symbol.nupkg”文件只不过是一个 zip 文件。 Visual Studio 需要首先找到一个远程 .pdb 文件(通过程序集散列),然后该文件将指向散列的源文件 url。像 ProGet 这样的符号服务器将重新索引 pdb 文件并基于它提供文件。请参阅inedo.com/support/kb/1036/using-progets-symbol-server
@anthonybell 根据 MS documenation 这应该是可能的,但到目前为止 VS 无法从网络共享或本地文件夹加载符号包。
我必须修改我的提要的“符号服务器”设置并禁用设置“从从该提要下载的包中剥离符号文件”。但是卸载然后重新安装包仍然没有在包中包含 *.pdb 文件。
重新启动 ProGet 也没有帮助,但我正在运行旧版本的 Visual Studio (2012) 和 ProGet (3.8.6)。
P
Pang

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

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

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


M
Matt Frear

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

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

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

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


以上关于符号服务器的选项更好。这种方法每次都容易出错且耗时。设置符号服务器是一次性设置
感谢那。尽管我被否决的答案很费力,但我支持它,因为它允许我在没有源服务器的情况下调试我的代码和 NuGet 包
我不希望团队中的任何人这样做,因为它容易出错且耗时。投反对票,因为我认为这不是处理它的正确方法。我敢肯定,如果有足够多的人同意你的观点,认为这是一种明智的做法,那么他们会投赞成票,我会得到彻底的纠正。
如果您有源代码,也可以这样做:在使用 nuget 包的项目的项目属性中,将私有 nuget 包源代码的 bin\debug 文件夹添加到引用路径。 (见mariuszrokita.com/…
投票是因为它不需要购买/安装一些随机产品或服务器,或者更改 nuspec,您可能并不总是希望快速查看某些内容。只需正确使用源代码管理即可撤消您的更改。 git co .。完毕
M
Matt Frear

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

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

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

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

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

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


这仅适用于新的项目文件格式 / ProjectReferences
您的示例位置是 Windows 上的默认全局包位置 (%userprofile%\.nuget\packages)。从那里到 NuGet 3.3+ 中的 dll 的路径是 packagename\version\lib\。那是你复制的地方吗?您是手动复制还是使用 nuget add?
@jla 是的,你应该看到现有的 dll,要么复制它,要么我重命名原始的,以防你想恢复它。
J
Jack Ukleja

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

在代理上安装适用于 Windows 的调试工具。

安装并启用 Symbol Server 插件。

将符号文件索引器构建功能添加到您的构建配置中。

确保 PDB 文件作为人工制品输出。

将 Visual Studio 配置为使用 TeamCity 作为源服务器。

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

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


h
hofnarwillie

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

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

以管理员身份运行 Visual Studio 打开并启动宿主应用程序(安装 Nuget 包的那个)而不进行调试 (Ctrl + F5) 在 Nuget 包解决方案中,确保工具 > 选项 > 调试 > 常规 > “需要源文件完全匹配原始版本”未选中。确保未选中“仅启用我的代码”在“工具”>“选项”>“调试”>“符号”中添加一个新文件夹,指向 Nuget 包的源目录。 (您从字面上输入文件夹路径,见下图)单击 Debug > Attach to Process... 查找 iisexpress (可能有多个,附加到所有都不会造成任何伤害)

https://i.stack.imgur.com/ivCF3.png


@克里斯蒂安E。 nuget 包可以是类库。上面的说明正是为此。它仍然需要在您安装 nuget 包的网站或控制台应用程序等主机应用程序中执行。
B
BatteryBackupUnit

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

https://github.com/GitTools/GitLink

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


N
NYCdotNet

Microsoft 现在已在 https://github.com/dotnet/sourcelink/ 中集成了 SourceLink NuGet 包,如果 NuGet 包的发布者设置了源代码,则可以在调试时按需下载源代码。