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

Yat*_*iac 28 c# visual-studio nuget nuget-package

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

我尝试引用包的解决方案,但无法正常工作.

我正在使用Visual Studio 2013.

NtF*_*reX 26

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

Visual Studio从这里描述的不同位置加载那些符号文件.但调试nuget包的easyies方法是将包的.pdb文件放在要调试的项目的build output文件夹中.


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

在此输入图像描述

用户和非用户代码

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

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

  • DebuggerNonUserCodeAttribute告诉调试器它应用的代码不是我的代码.
  • DebuggerHiddenAttribute隐藏调试器中的代码,即使Just My Code已关闭.
  • DebuggerStepThroughAttribute告诉调试器逐步执行它应用的代码,而不是单步执行代码.

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

  • 从我尝试的每一个疯狂的解决方案,我浪费了我的时间是最简单的.我只是提取我​​的`nuget.symbols.nupkg`并将pdb转储到下载的dll旁边的bin目录中,取消选中`Enable only my code`,然后我可以进入我的NuGet包.我甚至不需要将源文件添加到解决方案"Debug Source Files"面板中.我不明白为什么每个人都建议超过顶级,极其复杂的解决方案?+1为你交配! (4认同)
  • 如果我关闭_Enable Just My Code_,我最终必须在接近我的代码之前逐步完成一堆.NET 框架内容。这并不理想,但在构建 NuGet 包时禁用_优化代码_对我来说是唯一合理的选择。只需记住将其切换回部署即可。 (2认同)

Fra*_*ank 22

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

在此输入图像描述

只需将调试符号嵌入到 dll 中即可。更新你的 nupkg,瞧!

  • 上面是 VS 2022,以防 UI 看起来有点陌生。 (4认同)

xha*_*fan 20

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

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

    <PropertyGroup Condition="'$(Configuration)'=='Debug'">
      <DebugType>full</DebugType>
      <DebugSymbols>true</DebugSymbols>
    </PropertyGroup>
    
    Run Code Online (Sandbox Code Playgroud)

    或者右键项目属性,build,advanced,输出调试信息——设置为full。

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

    <ItemGroup>
      <PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.2" PrivateAssets="All" /> 
    </ItemGroup>
    
    Run Code Online (Sandbox Code Playgroud)

    更多信息在这里

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

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

  • 这是一个很好的答案!SourceLink 现在已被微软接管,因此这里是新的存储库 https://github.com/dotnet/sourcelink/。唯一的遗憾是这需要 packagereference 和 .NET Core。 (2认同)
  • “抑制模块加载时的 JIT 优化(仅限托管)”有什么作用? (2认同)

ds4*_*940 8

我通过在Debug模式下构建nuget包起源的项目来工作,然后将pdb和dll从debug目录复制到要在其中调试它的项目内nuget dll的位置。

例如从复制

ExternalNugetPackage \ bin \ Debug \

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


Leo*_*SFT 7

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

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

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

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

有关详细信息,请参阅创建符号包.

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

注意:将源代码添加到调试源文件中以获取引用该包的解决方案(右键单击Solution,选择Properties ... Common Properties ... Debug Source Files,然后添加相关二进制引用的根源目录)

  • 这只是不起作用 - 我不知道为什么......但是我花了太多时间试图找出它应该对我们来说很简单.将pdb文件放在构建项目的bin目录中......直接为我工作(只需取消选中Enable My Code" (2认同)