Описан только CV7, посмотреть можно в исходниках ваткома или его последователей (не помню, то ли в JWASM или в YASM). А там описание какой версии??? Если бы не сессия, то глянул бы с удовольствием. А зачем они копали пдб??? А также, на форуме фасма лежал скрипт, который делал из фасм дебуг инфо пдб файл. Только фасм там нужен был особенный какой-то. Там есть ссылка, но она не работает . Правда скрипт добавлял только метки. У меня он так и не заработал.
Я занимался разбором, писал парсер. Недописал - осталась одна противная бага, остальное работает, хнык (
Great Подтверждаю, к тому же бага очень непонятная и видимо связана с особенностями формата (где-то какое то поле на каком то этапе корректируется в памяти), о которых мы не знаем.
В составе VS 2008 идёт DIA (Debug Interface Access) SDK и пример Dia2Dump, дампящий .PDB по всякому используя COM-сервер msdia90.dll. Есть ещё cv2pdb, утилитка из Digital Mars D, конвертирующая из CodeView в PDB (эти, небось, знают, как mspdb80.dll для создания PDB использовать). С самим форматом файла, похоже, всё не так просто.
сам формат не сложен, сложно (потому что не документировано) устойство самой символьной инфомации в потоках - хоть и частичные сорцы в паблик утекали, одних хидеров не хватит, чтобы понять, увы .( я вот так и не понял, почему при резолве символа у ехешника все работает, а при резолве символа у такой же дллки - возвращается адрес совешенно отфонарный. типы перечисляются нормально у меня, символы перечисляются тоже. только с оффсетами один косяк и всё
Проясним ситуацию. - Если нужно парсить пдб для разрешения символов и только, то достаточно функций Sym* из dbghelp.dll Если нужно парсить инфу о типах или экзотически парсить символы, для чего недостаточно дбгхелпа, то есть DIA, в состав студии входит DIA SDK, в качестве примера можно взять pdbdump, в качестве задания для обучения - доработать его, например, чтобы он правильно определял union'ы. - Если не хочется DIA, тогда есть недокументированная mspdbXX.dll (XX - версия), там есть набор апи для парсинга GSI, PSI, TPI (global symbol information, private symbol information, type information) и другие прелести. Кстати говоря, и dbghelp и DIA основаны в конце концов на этой самой mspdb. В исходниках nt4 можно найти прототипы ее интерфейсов, но, увы, старой версии. Для новой нужно реверсить новые апишки, которые там появились, чтобы заполучить прототип. - Ну и, наконец, последний вариант, если нужно парсить пдб там, где нет mspdb/DIA, например, в линуксе, или же в ядре, то тогда остается только ручной разбор формата. На последок пару слов про формат. Пдб на самом деле не пдб, а обернут во внешний формат-контейнер MSF, Multi-Stream File (иногда неофициально расшифровывают Microsoft Stream Format). MSF файл состоит из страниц фиксированного (для конкретного файла) размера, в начале есть заголовок, в том числе там есть и размер страницы. Так же он содержит таблицу страниц (что-то вроде таблицы размещения в FAT), где написано какие потоки в каких страницах лежат. Логические составляющие MSF-контейнера - потоки. Потоком там считается логически непрерывная область данных. (в файле они могут лежать совсем не непрерывно, про таблицу размещения я уже упоминал). Заголовок MSF 7.0 имеет следующую структуру: Код (Text): Offset Size Comment ----------------------------------------- 0x00 0x20 Signature 0x20 DWORD Page size 0x24 DWORD FPM page (FPM == free page map) 0x28 DWORD Page count 0x2c DWORD Size of stream directory (in other sources, 'root directory') 0x30 DWORD Zero (reserved) 0x34 0x124 Array of 0x49 DWORDs: array of pointers to root pointers. Как видно, в начале есть сигнатура (откройте любой PDB и увидите её), есть размер страницы, номер FPM, число страниц (кстати размер файла в точности равен PageSize*PageCount), размер каталога потоков и, конечно же, массив "указателей на корневые указатели". Это номера страниц, где расположен массив номеров страниц каталога потоков (о как!). Легко заметить, что максимальный размер MSF очень очень большой. Root directory, он же каталог потоков, содержит дворд с числом потоков, а дальше идет массив двордов (размер массива == число потоков), а в массиве лежит для каждого потока число страниц, которые он занимает. Сразу после подряд идут номера страниц, где лежат данные первого потока, потом сразу же номера страниц для второго потока и так далее до конца root directory. Этой информации должно быть достаточно для написания MSF парсера. Теперь о том, что же лежит в потоках у pdb. Код (Text): Stream# Comment ---------------------------- 0 MSF root directory (copy (?)) 1 PDB headers 2 TPI (type information) 3 DBI 5 FPO (frame pointers omission information) dynamic GSI (global symbol information) dynamic PSI (private symbol information) Номера потоков GSI и PSI лежат в заголовке DBI. Дальше, думаю, здесь распинаться смысла нет, если кому интересно сделать парсер, пишите - я напишу остальное об устройстве заголовков потока PDB и других потоков и любезно предоставлю свои исходники для совместной доработки.
Great пока гулял, вот что подумал: а что тебе мешает сразу "любезно предоставить свои исходники", без всех этих "кому интересно, пишите"? Неужели то же, что помешало опубликовать пол-года назад обещанный диспетчер С++ исключений? Начинаю подозревать, дело не утешении ЧСВ, а более технические проблемы.