13

D:\symbolsVisual Studio のオプションでシンボル キャッシュ ディレクトリを設定しています。

オプション

ole32.pdbこのディレクトリ内に、Visual Studio は、PDB ファイル名 (例: ) に一致する最上位のディレクトリを持つ階層を作成しますD0C3BDDD4ADD4E87B2B5E803303B8D772。 Microsoft Symbol Servers からダウンロードします。

これらの 16 進数は、PDB ファイルのバージョンを表していると思います。これらの数値に何らかの構造や意味があるのか​​どうか、そして PDB ファイルからどのように抽出できるのか (理想的には C# を使用して) 疑問に思います。

他のフォルダーに PDB ファイルがある場合、Visual Studio デバッガーが検索するシンボル キャッシュ内のディレクトリを見つけることは可能ですか?

4

2 に答える 2

9

最初の 32 桁は、PE ファイル (DLL、EXE など) と対応する PDB の両方に焼き付けられた単なる GUIDですリンク、署名などによるプロセス)。ほとんどの場合、年齢は 1 桁の 16 進数に収まるため、合計で 33 桁になり、署名と呼ばれることもあります。Debug Interface Access 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; }
}
于 2013-07-22T23:57:43.807 に答える