如何调试我创建的 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 包中的代码的主要内容,如果未能解决你的问题,请参考以下文章