如何调试我创建的 NuGet 包中的代码

Posted

技术标签:

【中文标题】如何调试我创建的 NuGet 包中的代码【英文标题】:How to debug code in NuGet package created by me 【发布时间】:2017-11-11 10:58:43 【问题描述】:

我在另一个解决方案中创建并安装了一个 NuGet 包,但现在我需要在从我的新解决方案调用时调试包的代码。

我尝试引用包的解决方案,但它不起作用。

我正在使用 Visual Studio 2013。

【问题讨论】:

相关:How to debug into my nuget package deployed from TeamCity? 【参考方案1】:

要调试任何 dll,您需要它的符号文件 (.pdb)。如果您在 debug 配置中构建项目,您将看到这些文件已生成并放入构建输出文件夹中。

Visual Studio 从不同位置加载这些符号文件,如 here 所述。调试 nuget 包的最简单方法是将包的 .pdb 文件放在要调试的项目的构建输出文件夹中。


如果您尝试调试的代码被归类为非用户代码,您需要在调试选项中取消选中 Just My Code

Microsoft - Visual Studio Docs 中的以下引用显示了哪些是用户代码,哪些是非用户代码。

用户和非用户代码

为了区分用户代码和非用户代码,Just My Code 查看 符号 (.pdb) 文件和程序优化。调试器认为 优化二进制文件或 .pdb 时的非用户代码 文件不可用。

三个属性也会影响调试器认为是我的 代码:

DebuggerNonUserCodeAttribute 告诉调试器它应用的代码不是我的代码。 DebuggerHiddenAttribute 对调试器隐藏代码,即使关闭了“仅我的代码”也是如此。 DebuggerStepThroughAttribute 告诉调试器单步执行它所应用的代码,而不是单步执行代码。

所有其他代码都被视为用户代码。

更详细的答案可以在on my blog找到。

【讨论】:

从我尝试过并浪费时间的所有其他疯狂解决方案中,这是最简单的。我只需提取我的 nuget.symbols.nupkg 并将 pdb 转储到下载的 dll 旁边的 bin 目录中,取消选中 Enable just my code 即可进入我的 NuGet 包。我什至不需要将源文件添加到解决方案“调试源文件”面板中。我不明白为什么每个人都建议过分复杂的解决方案?为你的伴侣 +1! @ppumkin 感谢您提供有关Enable just my code 的信息。我已更新我的答案以包含此信息。 我在另一个项目上再次尝试过,它说源代码丢失.. 所以上次我将源代码包含在属性中并且它工作但这个新项目我没有,所以我无法进入代码——但是当你尝试介入时,你也会得到“缺少源代码”。然后你可以点击“导航到源”并选择包含所有源文件的文件夹(在我的例子中是从 nuget 包中解压的)繁荣——步入代码。另一种方法是在 Visual Studio 中打开文件。文件 -> 打开(确切的源文件) 如果我关闭 Enable Just My Code,我最终不得不在接近我的代码之前逐步完成一堆 .NET 框架的东西。这并不理想,但在构建 NuGet 包时禁用 优化代码 对我来说是唯一合理的选择。只需要记住将其切换回来进行部署。 从docs.microsoft.com/sr-latn-rs/visualstudio/debugger/…复制没有署名【参考方案2】:

对于 Visual Studio 2017 和托管在 GitHub 或 BitBucket 上的 nuget 包源代码:

    在 *.csproj 文件中启用完整的调试信息:

    <PropertyGroup Condition="'$(Configuration)'=='Debug'">
      <DebugType>full</DebugType>
      <DebugSymbols>true</DebugSymbols>
    </PropertyGroup>
    

    或者右键项目属性,构建,高级,输出调试信息——设置为full。

    要为您的 nuget 包 dll 启用自动源下载和步进,请将 nuget 包 SourceLink.Create.CommandLine 添加到您的项目中,或手动将其添加到 *.csproj 文件中:

    <ItemGroup>
      <PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.2" PrivateAssets="All" /> 
    </ItemGroup>
    

    更多信息here。

    在工具 - 选项 - 调试中,禁用“仅启用我的代码”,并启用“在模块加载时抑制 JIT 优化(仅限托管)”。

    在此之后,您应该能够从您的 nuget 包 dll 中进入方法。

【讨论】:

这是一个很好的答案! SourceLink 现在已被 Microsoft 接管,因此这是新的 repo github.com/dotnet/sourcelink。唯一的遗憾是这需要包引用和 .NET Core。 Suppress JIT optimization on module load (Managed Only) 是做什么的? 当包被 JIT 优化时,正在执行的代码与源代码略有不同(优化)(例如,一些小方法可能被内联等),并且单步执行调试器不会反映行确切的代码。 第一步是not required since Visual Studio 2019。 很好的答案!它适用于我使用 Castle.Core 进行的调试。 +1【参考方案3】:

我通过在调试模式下构建 nuget 包源自的项目,然后将 pdb 和 dll 从调试目录复制到我想要调试它的项目中的 nuget dll 的位置来完成这项工作。

例如复制自

ExternalNugetPackage\bin\Debug\

ProjectDirectory\Packages\ExternalNugetPackage.1.0.0\lib\net4.5

【讨论】:

太棒了...拯救了我的一天。【参考方案4】:

如何调试我创建的 nuget 包中的代码

正如 NtFreX 回答的那样,“要调试任何 dll,您需要它的符号文件 (.pdb)。”。因此,您可以创建符号包,允许消费者在 Visual Studio 调试器中单步执行您的包代码。

我们的做法(和工作方式):

    创建“*.symbols.nupkg”。 将符号包部署到 SymbolSource 服务器。 配置 IDE,包使用者可以在 Visual Studio 中将https://nuget.smbsrc.net/ 添加到您的符号源中。 使用 NuGet(来自我们的 SymbolSource 服务器)将所需的库添加到项目中。 调试。

详细信息可以参考Creating symbol packages。

如果这些包不适合在 NuGet Gallery/SymbolSource 上发布,您可以将 *.nupkg 和 *.symbols.nupkg 文件放在本地磁盘上。

注意:将源代码添加到引用包的解决方案的Debug Source Files(右键单击Solution,选择Properties...Common Properties...Debug Source Files,并添加相关的根源目录二进制引用)

【讨论】:

这不起作用-我不知道为什么..但是我花了太多时间试图弄清楚什么时候对我们来说应该简单。将 pdb 文件放在构建项目的 bin 目录中.. 对我来说立即工作(只需取消选中启用我的代码“【参考方案5】:

有一个更简单的解决方案:

只需在 dll 中嵌入调试符号。更新您的 nupkg,等等!

【讨论】:

以上是VS 2022,以防UI看起来有点陌生。【参考方案6】:

因为它可能对其他人有帮助,这里是手头问题的补充说明。

调试我创建的 pkg 需要什么?

    正如这里的其他人所说。 .pdb 文件。 另外,源代码表示为here。

那么,我怎样才能包含我的 nuget 包的源代码?

我必须包含符号包。这个答案here 向我展示了如何。

【讨论】:

以上是关于如何调试我创建的 NuGet 包中的代码的主要内容,如果未能解决你的问题,请参考以下文章

使用 FHIR nuget 包通过引用查找包中的资源

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

使用 .targets 替换 NuGet 包中的文件

NuGet 包中的文档消失了

如何通过 NuGet 包共享源代码以用于 .NET Core 项目

NuGet 包中的运行时异常引用类型:'无法加载文件或程序集'Foo'。该系统找不到指定的文件。'