2013-07-22 38 views
13

我有一個符號緩存目錄設置爲D:\symbols在Visual Studio中選擇:Visual Studio符號緩存中的目錄名稱D0C3BDDD4ADD4E87B2B5E803303B8D772是什麼意思?

Options

在這個目錄中的Visual Studio創建與頂級目錄匹配PDB文件名(如ole32.pdb)的層次結構,在下級別是一個或多個目錄,如D0C3BDDD4ADD4E87B2B5E803303B8D772(看起來像33位十六進制數字),其內部是PDB文件本身,可能是從Microsoft Symbol Server下載的。

我想這些十六進制數字代表PDB文件的版本。我想知道,這些數字是否有任何結構或含義,以及如何從PDB文件(理想情況下使用C#)中提取它們?

給定一個其他文件夾中的PDB文件,是否有可能在符號緩存中找到Visual Studio調試器要查找的目錄?

回答

9

第32位是剛剛被雙雙進入PE文件(DLL,EXE,...)和相應的PDB烤一個GUID,下一個數字是所謂年齡在十六進制表示不帶前導零(它可能會通過鏈接,簽名等在構建過程中增加)。在大多數情況下,年齡適合一個十六進制數字,因此總共有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; } 
} 
相關問題