2013-07-22 4 views
13

Ich habe ein Symbol Cache-Verzeichnis zu D:\symbols in Visual Studio Optionen:Was bedeuten Verzeichnisnamen wie D0C3BDDD4ADD4E87B2B5E803303B8D772 in Visual Studio-Symbolcache?

Options

In diesem Verzeichnis Visual Studio erstellt eine Hierarchie mit Top-Level-Verzeichnissen PDB-Dateinamen passenden (zB ole32.pdb), auf dem nächsten level sind ein oder mehrere Verzeichnisse wie D0C3BDDD4ADD4E87B2B5E803303B8D772 (die wie 33-stellige hexadezimale Zahlen aussehen) und in ihnen sind PDB-Dateien selbst, vermutlich von Microsoft Symbol Servern heruntergeladen.

Ich nehme an, dass diese hexadezimalen Zahlen Versionen von PDB-Dateien darstellen. Ich frage mich, ob diese Zahlen irgendeine Struktur oder Bedeutung haben und wie sie aus PDB-Dateien extrahiert werden können (idealerweise mit C#)?

Gibt es eine PDB-Datei in einem anderen Ordner, ist es möglich, ein Verzeichnis im Symbolcache zu finden, in dem der Visual Studio-Debugger danach suchen würde?

Antwort

9

die ersten 32 Stellen wird nur eine GUID, die sowohl in der PE-Datei eingebrannt wird (DLL, EXE, ...) und eine entsprechende PDB, wird als nächstes Ziffer Alter in Hexadezimaldarstellung sogenannte ohne führende Nullen (it kann während eines Build-Prozesses durch Verknüpfen, Signieren usw. erhöht werden). In den meisten Fällen passt ein Alter in eine einzelne hexadezimale Ziffer, daher insgesamt 33 Ziffern, manchmal Signatur genannt. Mit der Debug Interface Access SDK können Sie eine Signatur aus einer PDB-Datei extrahieren. Ein Beispiel 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; } 
}