gpt4 book ai didi

c# - Visual Studio 符号缓存中的 D0C3BDDD4ADD4E87B2B5E803303B8D772 等目录名称是什么意思?

转载 作者:可可西里 更新时间:2023-11-01 08:09:42 25 4
gpt4 key购买 nike

我在 Visual Studio 选项中将符号缓存目录设置为 D:\symbols:

Options

在此目录中,Visual Studio 创建了一个层次结构,其顶层目录与 PDB 文件名(例如 ole32.pdb)相匹配,在下一层是一个或多个目录,例如 D0C3BDDD4ADD4E87B2B5E803303B8D772(看起来像 33 位十六进制数),里面是 PDB 文件本身,大概是从 Microsoft Symbol Servers 下载的。

我想这些十六进制数代表 PDB 文件的版本。我想知道,这些数字是否有任何结构或意义,以及如何从 PDB 文件中提取它们(理想情况下,使用 C#)?

给定某个其他文件夹中的 PDB 文件,是否可以在符号缓存中找到 Visual Studio 调试器查找它的目录?

最佳答案

前 32 位数字只是一个 GUID,它被烘焙到 PE 文件(DLL、EXE 等)和相应的 PDB 中,接下来的数字是所谓的 age 十六进制表示形式,没有前导零(它可能会在构建过程中通过链接、签名等方式递增)。在大多数情况下,年龄适合单个十六进制数字,因此总共有 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; }
}

关于c# - Visual Studio 符号缓存中的 D0C3BDDD4ADD4E87B2B5E803303B8D772 等目录名称是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17799013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com