Загрузить данные из файла Microsoft pdb, используя dia-sdk
Привет я пытаюсь прочитать данные из файлов pdb
Я следовал инструкциям из Как использовать MS DIA SDK из C#? и сгенерировал сборку
Проблема заключается в следующем: при вызове dataSource.loadDataFromPdb для файла MS pdb он вызывает исключение ComException(HRESULT: 0x806D000C).
Я пытался использовать dumpbin.exe / headers, но он не работает с "неизвестным форматом"
Использование.loadDataFromPdb и dumpbin на самогенерируемом pdb работает как надо
IDiaDataSource dataSource = new DiaSourceClass();
//dataSource.loadDataFromPdb(@"D:\Symbols\System.Data.Entity.pdb"); // Fails
dataSource.loadDataFromPdb(@"D:\Symbols\myassembly.pdb"); // Success
IDiaSession session;
dataSource.openSession(out session);
var guid = session.globalScope.guid.ToString();
Есть ли другой способ открыть файлы MS pdb, и специально извлечь GUID
2 ответа
Небольшая математика, основанная на приведенной здесь информации, предполагает, что 0x806D000C соответствует E_PDB_FORMAT, для которого в MSDN есть описание: "Попытка получить доступ к файлу с устаревшим форматом".
Исходя из этого, я должен спросить (да, возможно позднее)... Помните ли вы, с какой версией Visual Studio и DIA вы пытались это сделать? Вполне возможно, что формат PDB мог измениться для тех PDB, отправляемых Microsoft, что ваши инструменты, возможно, не были обновлены.
Вы можете прочитать значение GUID из файла.pdb, используя BinaryReader, как показано ниже. Ключ получает смещения:
var fileName = @"c:\temp\StructureMap.pdb";
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
using (BinaryReader binReader = new BinaryReader(fs))
{
// This is where the GUID for the .pdb file is stored
fs.Position = 0x00000a0c;
//starts at 0xa0c but is pieced together up to 0xa1b
byte[] guidBytes = binReader.ReadBytes(16);
Guid pdbGuid = new Guid(guidBytes);
Debug.WriteLine(pdbGuid.ToString());
}
}
чтобы получить значение из.dll или.exe требуется немного больше работы:)