PDB формат

Тема в разделе "WASM.WIN32", создана пользователем RET, 29 май 2010.

  1. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Есть у кого собственно описание формата?
     
  2. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Может просмотрщик кто знает этих файлов с символами?
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    описание - сорцы wine.
    просмотрщик - windbg/pdbdump
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    В составе студии идут сорцы PDBDump, если их собрать, довольно неплохая штука получается.
     
  5. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Описан только CV7, посмотреть можно в исходниках ваткома или его последователей (не помню, то ли в JWASM или в YASM).

    А там описание какой версии??? Если бы не сессия, то глянул бы с удовольствием.
    А зачем они копали пдб???


    А также, на форуме фасма лежал скрипт, который делал из фасм дебуг инфо пдб файл. Только фасм там нужен был особенный какой-то. Там есть ссылка, но она не работает :dntknw:. Правда скрипт добавлял только метки. У меня он так и не заработал.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я занимался разбором, писал парсер. Недописал - осталась одна противная бага, остальное работает, хнык (
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    Great
    Подтверждаю, к тому же бага очень непонятная и видимо связана с особенностями формата (где-то какое то поле на каком то этапе корректируется в памяти), о которых мы не знаем.
     
  8. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    В составе VS 2008 идёт DIA (Debug Interface Access) SDK и пример Dia2Dump, дампящий .PDB по всякому используя COM-сервер msdia90.dll.

    Есть ещё cv2pdb, утилитка из Digital Mars D, конвертирующая из CodeView в PDB (эти, небось, знают, как mspdb80.dll для создания PDB использовать).

    С самим форматом файла, похоже, всё не так просто.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    сам формат не сложен, сложно (потому что не документировано) устойство самой символьной инфомации в потоках - хоть и частичные сорцы в паблик утекали, одних хидеров не хватит, чтобы понять, увы .(
    я вот так и не понял, почему при резолве символа у ехешника все работает, а при резолве символа у такой же дллки - возвращается адрес совешенно отфонарный.
    типы перечисляются нормально у меня, символы перечисляются тоже. только с оффсетами один косяк и всё
     
  10. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    pdbdump на sourcecode.com с исходниками имеется, но там жесткий ООП(MFC,ATL) и прочая муть.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Проясним ситуацию.
    - Если нужно парсить пдб для разрешения символов и только, то достаточно функций 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):
    1. Offset   Size       Comment
    2. -----------------------------------------
    3.   0x00   0x20       Signature
    4.   0x20   DWORD  Page size
    5.   0x24   DWORD  FPM page  (FPM == free page map)
    6.   0x28   DWORD  Page count
    7.   0x2c   DWORD  Size of stream directory (in other sources, 'root directory')
    8.   0x30   DWORD  Zero (reserved)
    9.   0x34   0x124  Array of 0x49 DWORDs: array of pointers to root pointers.
    Как видно, в начале есть сигнатура (откройте любой PDB и увидите её), есть размер страницы, номер FPM, число страниц (кстати размер файла в точности равен PageSize*PageCount), размер каталога потоков и, конечно же, массив "указателей на корневые указатели". Это номера страниц, где расположен массив номеров страниц каталога потоков (о как!). Легко заметить, что максимальный размер MSF очень очень большой.
    Root directory, он же каталог потоков, содержит дворд с числом потоков, а дальше идет массив двордов (размер массива == число потоков), а в массиве лежит для каждого потока число страниц, которые он занимает. Сразу после подряд идут номера страниц, где лежат данные первого потока, потом сразу же номера страниц для второго потока и так далее до конца root directory.
    Этой информации должно быть достаточно для написания MSF парсера.
    Теперь о том, что же лежит в потоках у pdb.
    Код (Text):
    1. Stream#    Comment
    2. ----------------------------
    3.      0     MSF root directory (copy (?))
    4.      1     PDB headers
    5.      2     TPI (type information)
    6.      3     DBI
    7.      5     FPO (frame pointers omission information)
    8. dynamic    GSI (global symbol information)
    9. dynamic    PSI (private symbol information)
    Номера потоков GSI и PSI лежат в заголовке DBI.

    Дальше, думаю, здесь распинаться смысла нет, если кому интересно сделать парсер, пишите - я напишу остальное об устройстве заголовков потока PDB и других потоков и любезно предоставлю свои исходники для совместной доработки.
     
  12. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Очень ценная информация.
     
  13. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Есть немного кода тут (Sources-> PdbReader/PdbWriter).
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    хз, с символами с сайта мс работает норм.
    копали для свой реализации виндовых либ работы с pdb.
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    reverser
    хм, интересный линк, спасибо,глянем. правда сишарп противен, но увы, что делоть=\
     
  16. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    На шарпе у меня есть исходники еще (где-то в сети нашел)
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    RET
    чота там хрень какаято с пдб никак не связанная
     
  18. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    мож перепутал...
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    J0E
    очень ценный пост лол :lol: идика погуляй дружище
     
  20. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Great пока гулял, вот что подумал: а что тебе мешает сразу "любезно предоставить свои исходники", без всех этих "кому интересно, пишите"? Неужели то же, что помешало опубликовать пол-года назад обещанный диспетчер С++ исключений? Начинаю подозревать, дело не утешении ЧСВ, а более технические проблемы.