C# Visual Studio符号缓存中的目录名D0C3BDDD4ADD4E87B2B5E80303B8D772是什么意思?

C# Visual Studio符号缓存中的目录名D0C3BDDD4ADD4E87B2B5E80303B8D772是什么意思?,c#,visual-studio,debugging,debug-symbols,pdb,C#,Visual Studio,Debugging,Debug Symbols,Pdb,我在Visual Studio选项中将符号缓存目录设置为D:\symbols: 在该目录中,Visual Studio创建了一个层次结构,其中顶层目录与PDB文件名(例如ole32.PDB)匹配,下一层是一个或多个目录,如d0c3bddd4add4e87b2b5e80303b8d772(看起来像33位十六进制数字),其中可能是PDB文件本身,从Microsoft符号服务器下载 我想这些十六进制数字代表PDB文件的版本。我想知道,这些数字是否有任何结构或意义,以及如何从PDB文件中提取它们(理想

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

在该目录中,Visual Studio创建了一个层次结构,其中顶层目录与PDB文件名(例如
ole32.PDB
)匹配,下一层是一个或多个目录,如
d0c3bddd4add4e87b2b5e80303b8d772
(看起来像33位十六进制数字),其中可能是PDB文件本身,从Microsoft符号服务器下载

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


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

此值是嵌入程序集和符号文件中的GUID,以便它们可以同步


您可以在程序集上运行
dumpbin/headers
以查看嵌入的GUID。

前32位只是一个GUID,它被烘焙到PE文件(DLL、EXE,…)和相应的PDB中,接下来的数字是所谓的年龄,以十六进制表示,没有前导零(在构建过程中,它可能通过链接、签名等方式递增)。在大多数情况下,一个年龄适合一个十六进制数字,因此总共33个数字,有时称为签名。您可以使用从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; }
}