dotNet符号文件(pdb),符号包(snupkg)和SourceLink

这篇具有很好参考价值的文章主要介绍了dotNet符号文件(pdb),符号包(snupkg)和SourceLink。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文的主题是 Visual Studio 调试 NuGet 包,以及符号包的概念,如何去发布一个 NuGet 包,让我们的 NuGet 包支持 SouceLink,这些都是我们开发中比较容易忽视的内容,但是熟悉了以后可以让我们在调试中得心应手,也是开源项目开发的基础篇。

demo 源代码在文末

pdb 符号文件

程序数据库 (.pdb) 文件(也称为符号文件)将项目源代码中的标识符和语句映射到已编译应用中的相应标识符和说明。 这些映射文件将调试器链接到源代码,以进行调试。

在 Visual Studio 调试器(C#、C++、Visual Basic、F#)中指定符号 (.pdb) 和源文件

符号文件的工作方式

.pdb 文件保存调试和项目状态信息,使用这些信息可以对应用的调试配置进行增量链接。 在调试时,Visual Studio 调试器使用 .pdb 文件来确定两项关键信息:

  • 要在 Visual Studio IDE 中显示的源文件名和行号。
  • 在应用中停止的断点位置。

调试器只会加载与在生成应用时创建的 .pdb 文件完全匹配的 .pdb 文件(即原始 .pdb 文件或副本)。

我们随便找一个自己代码的类库 Build 可以看一下
dotNet符号文件(pdb),符号包(snupkg)和SourceLink

简单的讲:我们平时在 Visual Studio 中调试代码 编译后的dll 文件在和 VS 内代码文件,断点等各种调试操作都是跟.pdb 文件内记录的信息做的映射。

符号包 (.snupkg)

创建符号包

符号包提供了一些关键信息,例如已编译的代码与源代码之间的关联、局部变量的名称、堆栈跟踪,代码源文件映射等。 你可以使用符号包 (.snupkg) 来分发这些符号(.pdb),并改善 NuGet 包的调试体验。

创建符号包

有两种方式可以创建符号包

  • .csproj 文件添加属性
<PropertyGroup>
    <IncludeSymbols>true</IncludeSymbols>
    <SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
  • 打包时指定参数
dotnet pack MyPackage.csproj -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg

那我们创建一个类库先用第二种命令行打包测试一下看看效果

dotNet符号文件(pdb),符号包(snupkg)和SourceLink

可以看到我们的符号包已经成功创建了。

接下来我们看一下符号包里面有什么东西
这里面用NuGetPackageExplorer本地工具,直接打开本地的包
dotNet符号文件(pdb),符号包(snupkg)和SourceLink

可以看到我们的.pdb 文件已经被打包到符号包中

SourceLink 源链接

源链接将源代码管理元数据添加到程序集和 NuGet 包,这么做的好处是进一步的获得最佳调试体验,把源链接元数据跟符号包中的pdb文件绑定

github sourcelink

.NET 8 开始,.NET SDK 默认包含对以下来源控制提供商的源链接(Source Link)支持:

  • GitHub 或 GitHub Enterprise
  • Azure Repos git 仓库(之前称为 Visual Studio Team Services)
  • GitLab 12.0+(对于旧版本,请查看 GitLab 设置)
  • Bitbucket 4.7+(对于旧版本,请查看 Bitbucket 设置)

如果您的项目使用.NET SDK 8+并托管在上述提供商中,则无需引用任何 Source Link 包或设置任何构建属性,Source Link 已默认启用。

否则,您可以通过设置几个属性并添加适用于提供商的 Source Link 包的 PackageReference 来启用项目中的 Source Link 体验,这样可以实现在指定的来源控制环境中进行无缝调试和源代码导航。
配置如下

<Project>
 <PropertyGroup>
    <!-- Optional: Publish the repository URL in the built .nupkg (in the NuSpec <Repository> element) -->
    <PublishRepositoryUrl>true</PublishRepositoryUrl>

    <!-- Optional: Embed source files that are not tracked by the source control manager in the PDB -->
    <EmbedUntrackedSources>true</EmbedUntrackedSources>
  </PropertyGroup>
  <ItemGroup>
    <!-- Add PackageReference specific for your source control provider (see below) -->
  </ItemGroup>
</Project>

如果你在 dotNet 8+ 的环境中引用任何的源代码管理包比如
github.com and GitHub Enterprise

<ItemGroup>
  <PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All"/>
</ItemGroup>

会禁用.NET SDK 中包含的 Source Link 功能。

本文的所有案例默认都是用 dotNet8 开发的 那按照说明如果代码在 github 那默认可以不用安装任何 SourceLinkpackage

接下来我们继续测试一下在类库中添加对应的属性

先提交一下代码,再打 pack
dotNet符号文件(pdb),符号包(snupkg)和SourceLink

从这可以看出我们的 pdb 符号文件已经包含了 git 的源代码信息。

推送 Nuget 包

发布 Nuget 包
我们这里使用dotnet cli推送
用命令行推送.nupkg包同名的.snupkg符号包默认也会被推送到 nuget.org

 dotnet nuget push dotNetParadise-SourceLink.1.0.1.nupkg -s https://api.nuget.org/v3/index.json --api-key %nugetApiKey%

dotNet符号文件(pdb),符号包(snupkg)和SourceLink

现在 NuGet 包已经推送上去了第一次推送的包 NuGet 平台需要对其进行索引病毒扫描等 大概需要几分钟

dotNet符号文件(pdb),符号包(snupkg)和SourceLink

可以看到我们的符号包以及源代码地址都已经在 NuGet 平台显示了。

VS 调试部分

前面做的部分实际上都是为了我们在给用户用的时候方便调试,那我们来调试一下看看这个过程。
创建新项目->NuGet 安装刚才上传的包

dotnet add package dotNetParadise-SourceLink --version 1.0.1

调试器查找符号文件的位置

  • 项目文件夹。

  • 在 DLL 或可执行 (.exe) 文件中指定的位置。

    • 默认情况下,如果你在计算机上已生成 DLL 或 .exe 文件,则链接器会将关联的 .pdb 文件的完整路径和文件名放入 DLL 或 .exe 文件中 。 调试器会检查该位置是否存在符号文件。
  • 与 DLL 或 .exe 文件相同的文件夹。

  • 在调试器选项中为符号文件指定的任何位置。

    • 任何本地符号缓存文件夹。

    • 指定的网络、Internet 或本地符号服务器和位置,例如 Microsoft 符号服务器(如果选择)。 Visual Studio 可从实现 symsrv 协议的符号服务器下载调试符号文件。 Visual Studio Team Foundation Server 和 Windows 调试工具是可使用符号服务器的两个工具。

  • 可能会用到的符号服务器包括:

    • 公共 Microsoft 符号服务器:要调试在调用系统 DLL 或第三方库时出 现的故障,通常需要系统 .pdb 文件。 系统 .pdb 文件包含 Windows DL、.exe 文件和设备驱动程序的符号 。 你可以从公共 Microsoft 符号服务器获取 Windows 操作系统、MDAC、IIS、ISA 和 .NET 的符号。

    • 内部网络或本地计算机上的符号服务器:你的团队或公司可为你自己的产品创建符号服务器,并作为外部源符号的缓存。 你自己的计算机上可能具有符号服务器。

    • 第三方符号服务器:Windows 应用程序和库的第三方提供程序可提供对 Internet 上的符号服务器的访问。

了解了这部分信息之后,我们的符号包是在 Nuget.org 中所以,需要在 Vs 中开启如下配置
dotNet符号文件(pdb),符号包(snupkg)和SourceLink

VS 工具->选项->调试->符号 开启上面符号服务器的选中,可以设置一个本地缓存的文件夹,另外下面选择仅加载指定模块(如果开启上面除了排除的全部加载大项目调试起来有点难受)

VS 设置 SourceLink

VS 工具->选项->调试-常规
dotNet符号文件(pdb),符号包(snupkg)和SourceLink

第一步要禁用启用仅我的代码

第二部 启用源服务器的支持

到这儿基本上配置已经全部完成了

实战测试一下
我们的类库实际上是封装了一个 MinimalApis 的自动注册功能,感兴趣的朋友可以去读一下我之前的文章

public class TodoApi : IEndPoint
{
    public void MapEndPoints(IEndpointRouteBuilder app)
    {
        var group = app.MapGroupWithTags("Todo");
        group.MapGet("sayhello", (string name) => $"hello {name}");
    }
}

创建一个 apiprogram 调用类库方法注册一下

app.RegisterEndPoints();

dotNet符号文件(pdb),符号包(snupkg)和SourceLink

可以看到很对 NuGet 类库 源码的调试就舒服多了,可以加断点修改代码,加类库调试。

最后

简要摘要:

本文介绍了在 Visual Studio中调试 NuGet 包的相关概念,包括 PDB 符号文件、符号包、Source Link 功能以及发布支持 Source LinkNuGet 包。通过配置符号包和 Source Link,开发者可以更轻松地调试外部依赖项的源代码,提高调试效率。

总结:

  • PDB 符号文件和符号包在调试中起着关键作用,帮助将源代码映射到编译后的应用程序,提供更详细的调试信息。
  • Source Link 通过在程序集和 NuGet 包中添加源代码管理元数据,实现了方便调试外部依赖项的功能。
  • 配置符号服务器路径和 Source Link 选项可以使 Visual Studio 更好地支持调试 NuGet 包的源代码。

本文Demo 源代码

希望本文能对你有帮助!文章来源地址https://www.toymoban.com/news/detail-843177.html

到了这里,关于dotNet符号文件(pdb),符号包(snupkg)和SourceLink的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ELF 文件格式 ------- 符号表

    ​ 上一篇文章分析节头表中分析到,节头表包含一个名字为 .symbol 的条目,该条目的 sh_entsize 成员不为 0,表明该条目指向的节中的内容是一张表,该表中的每一个条目的大小为 sh_entsize 个字节,通过 sh_size 成员可知道该节的总占用大小,因此就能够得出该节中一共有多少个

    2023年04月22日
    浏览(28)
  • 特殊符号引发的bug,C#去除不可作为文件名的特殊符号

    背景 前段时间小编开发了一个控制台程序,把数据库中的数据取出来按照编码名称分别存储文件,存储文件之前检查是否存在当前文件,如果存在删除。开始小批量的数据还挺顺利的,当批量执行问题就来了,每次执行到一半时,创建的文件不增加反而变少了,经过日志捕捉

    2024年02月16日
    浏览(29)
  • ELF文件格式、编译过程和符号表

    ELF的英文全称是The Executable and Linking Format,最初是由UNIX系统实验室开发、发布的ABI(Application Binary Interface)接口的一部分,也是Linux的主要可执行文件格式。 比如说用户空间的.out就是一个ELF的文件 一个程序的3个基本段:text段,data段,bss段。 text段:就是 放程序代码 的,编译时确

    2024年02月05日
    浏览(73)
  • “智能文件批量改名工具:轻松管理文件名,一键去除特殊符号“

    你是否曾经在面对一堆文件名中包含特殊符号,而感到困扰,不知道如何快速、准确地处理它们?现在,我们为你带来了一款智能文件批量改名工具,它可以轻松地帮助你去除文件名中的特殊符号,让你的文件管理更加规范、高效。 首先,我们要进行文件批量改名高手主页面

    2024年02月07日
    浏览(32)
  • Spring Boot入门(10):Mybatis之XML映射文件中如何使用特殊符号?揭秘<、<=等符号的正确使用方法!

            在Mybatis的XML映射文件中,我们经常需要使用一些特殊符号来完成SQL语句的拼接,比如小于号“”、小于等于号“=”等。然而,由于这些符号在XML中有特殊的含义,因此直接在映射文件中使用可能会导致编译错误或者运行时异常。那么,如何才能正确地使用这些特殊

    2024年02月09日
    浏览(31)
  • 掌握文件重命名快捷键,使用替换功能轻松删除文件名中的符号!

    您是否经常面对繁琐的文件重命名工作?是时候掌握一些文件管理的小技巧,让您的工作更加高效便捷了!现在,我们向您介绍一种简单的方法,通过文件重命名快捷键和替换功能,轻松删除文件名中的符号! 首先,我们要打开文件批量改名高手,并在板块栏里选择“文件批

    2024年02月14日
    浏览(24)
  • 将符号分隔的文本文件txt转换为excel的实现

    文本文件如下: 现在不好处理,打算将其转换为excel,其中通过冒号分割: line.split(\\\":\\\") main方法如下: 其中去掉了横线----------------------------------------,结果如下: 相关依赖如下:

    2024年02月10日
    浏览(28)
  • Windows系统文件快捷链接(软链接/硬链接/符号链接)mklink

    记录学习mklink 将大文件从c盘移出 快捷方式 软链接 硬链接 符号链接 常见文件链接方式 在Windows上以*.lnk结尾的文件,这类文件通常用于指定某一个文件或某一个目录的位置,可扩展性很强, 桌面快捷方式 就是这类了。 说明 软链接A是一个虚拟文件夹,基本上不占用空间B是

    2024年02月03日
    浏览(32)
  • iOS_crash文件的获取及符号化(解析)

    symbolicatecrash 是 Xcode 自带的 crash 日志分析工具 步骤1. 找到 symbolicatecrash ,打开 Terminal 执行: 稍等一会,就会输出路径,然后将路径复制,右键 Finder - 前往文件夹 - 粘贴 - 回车,就能找到 symbolicatecrash ,将 symbolicatecrash 拷贝出来备用 步骤2. 将 ./symbolicatecrash 、 crash 和 dSYM 文

    2024年02月12日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包