2013-07-22 22 views
13

Ho un elenco simbolo della cache impostato D:\symbols nelle opzioni di Visual Studio:Cosa significano nomi di directory come D0C3BDD4ADD4E87B2B5E803303B8D772 nella cache dei simboli di Visual Studio?

Options

All'interno di questa directory di Visual Studio crea una gerarchia di directory di livello superiore che corrispondono i nomi di file PDB (ad es ole32.pdb), sul prossimo livello sono una o più directory come D0C3BDDD4ADD4E87B2B5E803303B8D772 (sembrano numeri esadecimali di 33 cifre) e al loro interno sono file PDB, presumibilmente, scaricati da Microsoft Symbol Server.

Suppongo che questi numeri esadecimali rappresentino versioni di file PDB. Mi chiedo se questi numeri abbiano una struttura o un significato e come possano essere estratti dai file PDB (idealmente, usando C#)?

Dato un file PDB in qualche altra cartella, è possibile trovare una directory nella cache dei simboli in cui il debugger di Visual Studio dovrebbe cercarla?

risposta

9

Le prime 32 cifre è solo un GUID che viene cotto sia in file PE (DLL, EXE, ...) e una corrispondente PDB, cifre successive sono i cosiddetti età in esadecimali senza zeri (it potrebbe essere incrementato durante un processo di costruzione tramite link, firma, ecc.). Nella maggior parte dei casi, un'età si inserisce in una singola cifra esadecimale, quindi in totale 33 cifre, a volte denominata firma. È possibile estrarre una firma da un file PDB utilizzando Debug Interface Access SDK. Un esempio in 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; } 
} 
Problemi correlati