Visual Studio 符号缓存中的 D0C3BDDD4ADD4E87B2B5E803303B8D772 等目录名称意味着什么?

问题描述 投票:0回答:2

我在 Visual Studio 选项中将符号缓存目录设置为

D:\symbols

Options

在此目录中,Visual Studio 创建一个层次结构,其中顶级目录与 PDB 文件名匹配(例如

ole32.pdb
),下一级是一个或多个目录,如
D0C3BDDD4ADD4E87B2B5E803303B8D772
(看起来像 33 位十六进制数字)及其内部可能是 PDB 文件本身,是从 Microsoft 符号服务器下载的。

我认为这些十六进制数字代表 PDB 文件的版本。我想知道这些数字是否有任何结构或含义,以及如何从 PDB 文件中提取它们(理想情况下,使用 C#)?

给定其他文件夹中的 PDB 文件,是否可以在符号缓存中找到 Visual Studio 调试器要查找的目录?

c# visual-studio debugging debug-symbols pdb-files
2个回答
9
投票

前 32 位数字只是一个 GUID,它被烘焙到 PE 文件(DLL、EXE 等)和相应的 PDB 中,接下来的数字是所谓的 age,以十六进制表示,没有前导零(它可能会递增)在构建过程中通过链接、签名等)。在大多数情况下,年龄适合单个十六进制数字,因此总共 33 位数字,有时称为“签名”。您可以使用调试接口访问 SDK 从 PDB 文件中提取签名。 C# 中的示例: using System; using System.IO; using System.Linq; using System.Runtime.InteropServices; static class Program { // Pass a PDB file name as a command-line parameter static void Main(string[] args) { var pdbFile = args.FirstOrDefault(); if (!File.Exists(pdbFile)) return; try { var dataSource = (IDiaDataSource)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("83AB22C8-993A-4D14-A0E0-37BC0AAEA793"))); dataSource.LoadDataFromPdb(pdbFile); IDiaSession session; dataSource.OpenSession(out session); var globalScope = session.GlobalScope; Console.WriteLine(globalScope.Guid.ToString("N").ToUpperInvariant() + globalScope.Age.ToString("X")); } catch (COMException) { } // May happen for corrupted PDB files } } [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("79F1BB5F-B66E-48E5-B6A9-1545C323CA3D")] interface IDiaDataSource { void _VtblGap_1(); void LoadDataFromPdb(string pdbFile); void _VtblGap_3(); void OpenSession(out IDiaSession session); } [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("6FC5D63F-011E-40C2-8DD2-E6486E9D6B68")] interface IDiaSession { void _VtblGap_2(); IDiaSymbol GlobalScope { get; } } [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("CB787B2F-BD6C-4635-BA52-933126BD2DCD")] interface IDiaSymbol { void _VtblGap_43(); Guid Guid { get; } void _VtblGap_28(); uint Age { get; } }



4
投票

https://www.atmosera.com/blog/pdb-files-what-every-developer-must-know/

您可以在程序集上运行

dumpbin /headers

以查看嵌入的 GUID。

    

© www.soinside.com 2019 - 2024. All rights reserved.