Internet上有多种记录的方法,涉及如何使用Symbols源文件和Source Link在Nuget程序包内进行调试,但说实话,很难理解对我来说什么是好方法。
我们有一台Azure DevOps服务器,在其上生成Nuget程序包,同时使用.pdb
在构建管道中将Index Sources & Publish Symbols
文件发布到Azure DevOps Symbol Server,{{3 }}
“我的项目”也引用了Microsoft.SourceLink.Vsts.Git
和.csproj
文件中的这段代码
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
我已经阅读了几篇博客文章,但是我最相信最新的消息来源当然是官方described here。
readme.md
文件说
通常不再建议在.nupkg中包含PDB,因为这会增加包的大小,从而为使用您的包的项目恢复时间,无论用户是否需要通过库的源代码进行调试
我同意这一点,这就是为什么我要使用Symbol Server而不在Nuget软件包中包括.pdb
文件的原因。因此,请不要将我的问题标记为Source Link Git repository的重复项,因为接受的答案正是我不想做的。
自述文件还指出
.snupkg符号包有一些限制:
- 它们当前不支持Windows PDB(由VC ++生成,或者不支持将构建属性DebugType设置为full的托管项目)
- 他们要求该库由较新的C#/ VB编译器(Visual Studio 2017 Update 9)构建。
- 该程序包的使用者还需要Visual Studio 2017 Update 9调试器。
- Azure DevOps Artifacts服务不支持。
所以至少我知道我不能使用它。
但是设置Source Link并使其正常工作的正确方法是什么?
当我调试测试控制台应用程序时,它成功地将.pdb
文件下载到我的Symbols缓存文件夹中,但是如果我尝试使用F11
插入Nuget软件包中的代码,它只是不会工作。 (但是,它进入System.String.Concat
是因为我的简单测试Nuget Package实际上是串联了一些字符串)
我尝试运行sourcelink test TestSourceLink.pdb
,但得到error: url hash does not match
。我读过this one,发现sourcelink test
是旧事物,不支持对像我们这样的私有存储库的身份验证。
使用浏览器,如果我访问sourcelink print-json TestSourceLink.pdb
给出的URL,则可以看到最新的源代码。但是现在的问题是,为什么Visual Studio无法下载源代码?我已通过VS在此Azure DevOps服务器上进行身份验证,因为我能够安装来自该服务器的Nuget程序包。
这是我的调试设置:
非常感谢。我真的不知道这个谜题缺少什么
答案 0 :(得分:4)
好吧,在发布问题之前,我应该已经阅读并遵循了this answer,因为这是难题的一部分。
我需要遵循Eric's blog post的第5步和第6步,但是实际上我不需要修改pack
命令,因为我没有在Nuget软件包中包含.pdb
文件
注意:到目前为止,只有使用 Debug Build Configuration (调试构建配置)生成Nuget软件包时,我才能使此工作正常。如果您找到让Nulink包中的Release DLL使用Source Link的方法,请回答my other question。谢谢
这需要两件事:
.pdb
),该文件是调试器使用的映射文件。对于您解决方案中的每个项目:
仅当您计划Nuget软件包的使用者使用Visual Studio 2017时。如果要在Visual Studio 2019中使用Source Link,则不需要此步骤:
在Visual Studio中,右键单击您的项目-> Properties
,然后转到Build -> Advanced
,并将Debugging Information
从Portable
(默认值)更改为{{1} }
安装Microsoft.SourceLink.Vsts.Git Nuget程序包(必须在Visual Studio中选中Full
复选框)
编辑Include prerelease
文件,并在第一个.csproj
元素中包含以下代码:
PropertyGroup
创建名为 <PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
的管道变量(如果尚不存在)并将其值设置为BuildConfiguration
Debug
任务中,将此变量用作参数:.NET Core Build
--configuration $(BuildConfiguration)
任务中,在.NET Core Pack
字段中使用此变量:Configuration to Package
在管道的最后,您必须有一个任务$(BuildConfiguration)
Index Sources & Publish Symbols
字段中,也必须使用Artifact name
变量:BuildConfiguration
当然,您还必须具有一个Symbols_$(BuildConfiguration)
任务,才能将Nuget程序包推送到Azure DevOps Nuget Feed
.NET Core Push
单击Tools -> Options -> Debugging -> Symbols
按钮并验证服务器
New Azure DevOps Symbol Server Location...
。这是您所有C:\Symbols\
文件的存储位置 .pdb
单击Tools -> Options -> Debugging -> Symbols
。您可以在此处指定要加载的DLL的符号文件。
如果不执行此操作,并将默认值保留为Load only specified modules
,则在调试模式下运行程序时,Visual Studio将花费很长时间加载所有内容。
提示::要在调试时查看项目加载的所有DLL,请单击Load all modules, unless excluded
。在这里您可以查看完整列表,选择多个列表,然后右键单击Debug -> Windows -> Modules
Copy Value -> Copy Name
Tools -> Options -> Debugging -> General
Enable Just My Code
Enable source server support
当您想在Nuget软件包的代码中进行调试时,自然按下Enable Source Link Support
进入其中,Visual Studio会询问您是否同意从Azure DevOps存储库中下载源代码