Pio*_*lin 13 c# debugging debug-symbols visual-studio pdb
我D:\symbols在Visual Studio选项中设置了符号缓存目录:

在这个目录中,Visual Studio创建了一个层次结构,顶层目录与PDB文件名相匹配(例如ole32.pdb),在下一层是一个或多个目录,如D0C3BDDD4ADD4E87B2B5E803303B8D772(看起来像33位十六进制数字),里面是PDB文件本身,大概是,从Microsoft Symbol Servers下载.
我想这些十六进制数字代表PDB文件的版本.我想知道,这些数字是否具有任何结构或含义,以及如何从PDB文件中提取它们(理想情况下,使用C#)?
给定其他文件夹中的PDB文件,是否可以在符号缓存中找到Visual Studio调试器所需的目录?
前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; }
}
Run Code Online (Sandbox Code Playgroud)
该值是嵌入在程序集和符号文件中的 GUID,以便它们可以同步。
http://www.wintellect.com/blogs/jrobbins/pdb-files-what-every-developer-must-know
您可以dumpbin /headers在程序集上运行以查看嵌入的 GUID。
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |