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 可以看一下
简单的讲:我们平时在 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
那我们创建一个类库先用第二种命令行打包测试一下看看效果
可以看到我们的符号包已经成功创建了。
接下来我们看一下符号包里面有什么东西
这里面用NuGetPackageExplorer
本地工具,直接打开本地的包
可以看到我们的.pdb
文件已经被打包到符号包中
SourceLink 源链接
源链接将源代码管理元数据添加到程序集和 NuGet
包,这么做的好处是进一步的获得最佳调试体验,把源链接元数据跟符号包中的pdb
文件绑定
从.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
那默认可以不用安装任何 SourceLink
的 package
接下来我们继续测试一下在类库中添加对应的属性
先提交一下代码,再打 pack
从这可以看出我们的 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%
现在 NuGet
包已经推送上去了第一次推送的包 NuGet
平台需要对其进行索引病毒扫描等 大概需要几分钟
可以看到我们的符号包以及源代码地址都已经在 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 中开启如下配置
VS 工具->选项->调试->符号 开启上面符号服务器的选中,可以设置一个本地缓存的文件夹,另外下面选择仅加载指定模块(如果开启上面除了排除的全部加载大项目调试起来有点难受)
VS 设置 SourceLink
VS 工具->选项->调试-常规
第一步要禁用启用仅我的代码
第二部 启用源服务器的支持
到这儿基本上配置已经全部完成了
实战测试一下
我们的类库实际上是封装了一个 MinimalApis
的自动注册功能,感兴趣的朋友可以去读一下我之前的文章
public class TodoApi : IEndPoint
{
public void MapEndPoints(IEndpointRouteBuilder app)
{
var group = app.MapGroupWithTags("Todo");
group.MapGet("sayhello", (string name) => $"hello {name}");
}
}
创建一个 api
在 program
调用类库方法注册一下
app.RegisterEndPoints();
可以看到很对 NuGet
类库 源码的调试就舒服多了,可以加断点修改代码,加类库调试。
最后
简要摘要:
本文介绍了在 Visual Studio
中调试 NuGet
包的相关概念,包括 PDB
符号文件、符号包、Source Link
功能以及发布支持 Source Link
的 NuGet
包。通过配置符号包和 Source Link
,开发者可以更轻松地调试外部依赖项的源代码,提高调试效率。
总结:
PDB
符号文件和符号包在调试中起着关键作用,帮助将源代码映射到编译后的应用程序,提供更详细的调试信息。Source Link
通过在程序集和NuGet
包中添加源代码管理元数据,实现了方便调试外部依赖项的功能。- 配置符号服务器路径和
Source Link
选项可以使Visual Studio
更好地支持调试NuGet
包的源代码。
本文Demo 源代码
希望本文能对你有帮助!
dotNet符号文件(pdb),符号包(snupkg)和SourceLink的更多相关文章
- 符号文件(.pdb)——Windows 应用程序调试必备
最近在做项目需求过程中,时不时会遇到崩溃,总是异常中断,于是学习了windbg进行调试的一些基础,windbg在接下来文章进行更新,先介绍在windbg调试中一个重要文件(符号文件) 一.符号文件定义 ...
- DotNet中人民币符号的输出
DotNet中人民币符号“¥”的输出<html> <head>DotNet中人民币符号的输出</head> <body> <p>¥100元& ...
- IntelliJ IDEA 编译代码报错 找不到符号 符号: 找不到符号包 包
在使用IDEA的时候,经常出现过找不到包或者找不到符号的情况,可以尝试以下几种方式来解决 1.如果项目使用的是Maven可以使用Maven-Reimport 2.还可以 Invalidate and ...
- 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件
查找并指定符号文件和源文件:指定符号加载行为.使用符号和源服务器上:加载符号自动或在要求. 内容 查找符号 (.pdb) 文件 查找源文件 查找符号 (.pdb) 文件 说明 在之前的 Vis ...
- 探索 .Net Core 的 SourceLink
介绍 Source Link是一组软件包和一个规范, 它将一些元数据添加到PDB文件,以将本地文件重新映射到GitHub上的文件,因此Visual Studio可以在这需要时下载文件, 该项目的目的是 ...
- NuGet 符号服务器
在新的 VisualStudio 支持使用 NuGet 符号服务器,可以支持新的 Portable PDB 调试符号的库,本文告诉大家如何打包上传带符号的库和使用符号服务器 在 2018 的 11 月 ...
- 【旧文章搬运】关于windbg搜索符号文件的一点说明
原文发表于百度空间,2010-09-07========================================================================== 本来只是打 ...
- NuGet包调试源码的方法
如果按照nuget官网给出的网址:https://docs.nuget.org/create/creating-and-publishing-a-symbol-package 那么你会发觉下载符号包的 ...
- [Win32]一个调试器的实现(五)调试符号
一个调试器应该可以跟踪被调试程序执行到了什么地方,显示下一条将要执行的语句,显示各个变量的值,设置断点,进行单步执行等等,这些功能都需要一个基础设施的支持,那就是调试符号. 什么是调试符号 我们知道, ...
- 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)
知道了 csproj 文件中的一些常用 NuGet 属性,创建 NuGet 包时就可以充分发挥新 Sdk 自动生成 NuGet 包的优势,不需要 nuspec 文件啦.(毕竟 nuspec 文件没有 ...
随机推荐
- Python 装饰器解析(二)
前面一篇文章介绍了python装饰器,最后引入了functools.wraps的使用,本篇文章将对它进行深入的探究. functools模块提供了一系列的高阶函数以及对可调用对象的操作,其中为人熟知的 ...
- 对称加密算法汇总:AES DES 3DES SM4 java 实现入门
密码的世界 如果你是黑帮老大,平时和手下沟通,如何保证自己的信息安全呢? 在神探夏洛克的第一季中,就讲述了一个如何侦破黑帮的加密交流的故事. 这种密码利用的是密码字典. 密码本身可以是一本书,比如常见 ...
- Swoole从入门到入土(25)——多进程[进程间无锁计数器]
Atomic 是 Swoole 底层提供的原子计数操作类,可以方便整数的无锁原子增减.原子计数器有如下特点: - 使用共享内存,可以在不同的进程之间操作计数 - 基于 gcc/clang 提供的 CP ...
- Oracle system identifier already exists specify another SID
问题说明 Centos7重装Oracle,使用DBCA重新创建实例test的时候报错,中文意思是: Oracle系统标识符(SID)"test"已存在,请指定另一个SID. 问题原 ...
- Linux下SQLPLUS替代工具rlwrap安装使用
rlwrap工具可以解决linux下sqlplus 提供浏览历史命令行的功能,和删除先前输入错误的字母等问题 1.安装 需要readline包 这个安装光盘就有 [root@asm RedHat]# ...
- oracle中使用自定义函数解析指定分隔符的字符串
1.创建字符串表类型 create type tab_varchar is table of varchar2(2000); 2.创建管道函数 create or replace function g ...
- 一秒出图?SDXL-Turbo实时AI绘画整合包下载
SDXL Turbo是一种快速生成的AI构图模型,它基于一种称为对抗性扩散蒸馏的新训练方法,该方法允许在1到4个步骤中以高图像质量对大规模基础图像扩散模型进行采样,并将其与对抗性损失相结合,以确保即使 ...
- java基础之StringBuilder---03
StringBuilder概述 StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是StringBuilder对象中的内容是可变的. 如果对字符串进行拼接操作, ...
- 【Azure 事件中心】适用Mirror Maker生产数据发送到Azure Event Hub出现发送一段时间后Timeout Exception: Expiring 18 record(s) for xxxxxxx: 79823 ms has passed since last append
问题描述 根据"将 Apache Kafka MirrorMaker 与事件中心配合使用"一文,成功配置了Mirror Maker来发送数据到Event Hub中.为什么只能成功运 ...
- 【Azure Fabric Service】Service Fabric 遇见错误信息记录 - The process/container terminated with exit code:2148734499
问题描述 Service Fabric 在升级 Application 过程中,发布了新的代码后,启动应用中遇见了如下错误: Error message: System.Hosting' report ...