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