2013-07-22 5 views
13

mam katalogiem symbol pamięci podręcznej ustawiony D:\symbols w opcji Visual Studio:Co oznaczają nazwy katalogów, takie jak D0C3BDDD4ADD4E87B2B5E803303B8D772 w pamięci podręcznej symboli programu Visual Studio?

Options

W tym katalogu Visual Studio tworzy hierarchię z katalogów najwyższego poziomu dopasowania PDB nazwy plików (np ole32.pdb), na następny poziom to jeden lub więcej katalogów, takich jak D0C3BDDD4ADD4E87B2B5E803303B8D772 (wyglądających jak 33-cyfrowe liczby szesnastkowe), a wewnątrz nich są pliki PDB, prawdopodobnie pobrane z serwerów Microsoft Symbol.

Przypuszczam, że liczby szesnastkowe reprezentują wersje plików PDB. Zastanawiam się, czy liczby te mają jakąś strukturę lub znaczenie i jak można je wyodrębnić z plików PDB (najlepiej używając C#)?

Biorąc pod uwagę plik PDB w jakimś innym folderze, czy jest możliwe znalezienie katalogu w pamięci podręcznej symboli, gdzie będzie go szukać debugger Visual Studio?

Odpowiedz

9

pierwsze 32 cyfr jest tylko GUID, który piecze się zarówno w pliku PE (DLL, EXE, ...) i odpowiedni PDB, kolejne cyfry są tzw wiek systemu szesnastkowego bez zera na początku (to może być zwiększany podczas procesu kompilacji poprzez łączenie, podpisywanie itp.). W większości przypadków wiek mieści się w pojedynczej cyfrze heksadecymalnej, a więc w sumie 33 cyfry, czasami o nazwie podpis. Możesz wyodrębnić podpis z pliku PDB, korzystając z Debug Interface Access SDK. Przykład w języku 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; } 
} 
Powiązane problemy