Помогите, пожалуйста, если у кого-нидь есть четкая спецификация по архитектуре PDB файла... Буду очень признателен...
StatusError Старый формат у Шрайбера немного расписан и доступен в инете. Новый я поковырял пару дней и забил Если надо только читать - используй стандартный АПИ.
Спасибо за отзывы. если честно, я даже довольно неплохо расковырял этот грешный PDB. У меня только возникает проблема, коггда для пропатченного файла я генерю на выходе PDB - если отлаживать в софтайсе, то сишный код куда-то улетает... привязывается в nmsке не к тому адресу... я замучился уже с этой фигней... даже знаю, какой поток надо править, проблема в том, как там интерпретировать данные... такие дела...
Ты MSF7 ковыряешь? Если я правильно понял, тебе надо 4й поток. Его формат как раз и разбирал (методом тыка ) но уже не помню :-( В скрипте по моей ссылке можно глянуть... Вообще если с потоком я угадал, то может и получится что либо путное сделать совместными усилиями.
S_T_A_S_ Есть предложение добить-таки этот формат. Про номер потока точно сказать не могу. Знаю, что главный корневой поток символов имеет номер 3. От него по спискам объектных модулей идут ссылки на символы для каждого obj Файла, из которых линкуется бинарник. А так как файлов может быть сколько угодно, то и номер потока для отдельного объектника не угадать (только читать из заголовка)... Вот щас у меня основной вопрос с таблицей соответствия номеров строк в файле и смещений внутри РЕ секций... там как-то все хитро... Если есть желание объединить усилия по разбору... что ж пиши... обменяемся инфой, а там посмотрим...
Если от нуля считать, то это третий поток. Я придерживался нумерации Шрайбера, хотя может и ошибся =) А про много объектников ты прав, я совсем забыл Мне нужно было просто сгенерить PDB снуля, поэтому для простоты вcю инфу запихал в один поток. Сам этот поток выглядит так (это исходник для фасма, смысл большенства полей мне не ясен, но ключевые проименованы имхо верно) Код (Text): Stream4: .000 dd -1 .004 dw 0,131h .008 rb 16 .018 dd 11Ch,18Ch .020 dd 68h .24 dd .??-.Start?? .028 rb 56 .060 dw 0,0Ch .LinesData dd Lines.Entries?-Lines .LinesDataSize dd Lines.DataSize .06C rd 5 .080 db '12345678',0,'12345678',0,0,0 .094 rb 64 .0D4: times 58 db ' ' .10E rb 66 .150 db '0123456789',0,0 .15C db 2Dh, 0BAh, 2Eh, 0F1h .160 rd 7 .17C dd 1 .CodeStart dd CodeStart .CodeSize dd CodeEnd-CodeStart+1 .188 rb 44 .1B4 dd 2 .1B8 rb 40 .1E0 dd 2 .1E4 rb 36 .208 dd 4 .20C rb 228 .2F0 dw 0,1 .2F4 dd 0,0 .2FC dd 1000h .300 rb 80 .Start?? dw 3,1 .354 dw 0,0,0 .35A dw 1 ; это похоже количество файлов .35C dd 0,0 .364 db "X:\fill\path\to\source.", 0 align 4 .?? dd 0 .Size = $-Stream4 align PAGE_SIZE А это инфа о строчках и оффсетах на которую ссылается поток выше: Код (Text): Lines: ;rb 60h .Entries? dw 1,? ; это тоже похоже на количество объектников .EntryOffset dd .Entry-.Entries? .CodeStart? dd CodeStart ; начальный оффсет опкодов, у меня 0 .CodeEnd? dd CodeEnd dd ? .Entry dd 1 ; для первого объектника (у меня он один) dd .Data-.Entries? .CodeStart dd CodeStart .CodeEnd dd CodeEnd .FullName db "X:\fill\path\to\source.", 0 align 4 .Data dw 1 .NumberOfLines dw (.Numbers-.Offsets)/4 ; оффсеты на опкоды (от начала секции) .Offsets: dd 0 ; первая строка dd 2 ; вторая строка ;..... ; далее идёт инфа о строчках сорца (по 2 байта) .Numbers: dw 1 dw 2 ; /\ количество должно соответствовать оффсетам dd 0 .DataSize = $-.Entries? ; это сохраняется в 4м потоке (LinesDataSize) Помню были проблемы из-за того, что кое-что дублируется в разных местах. Остальное уже забыл за полтора года, а до поддержики нескольких исходников так и не дошел. :-( Но это все похоже ты и так разобрал уже. Что там за хитрости, с ходу не врублюсь Добить это дело конечно интересно, только вот со временем сейчас туго :-( ЗЫ: кста, сколько я не смотрел pdbdump, так и не понял, где там формат PDB можно узреть
Спасибо за безценный совет! Но, во-первых, DIA SDK - это уже не pdbdump, а во-вторых, (прошу прощения за тупость) что конкретно там ковырять?
S_T_A_S_ DIA SDK - это интерфейсы для доступа к pdb (на чтение). pdbdump - утилита, реализовавшая доступ к pdb через них. Для записи pdb они бесполезны В исходниках винды есть код для работы с pdb, правда, старых версий. Но может поможет?
IceStudent Вот и я о том же ) До кучи ещё одна бесполезная ссылка http://ftp.nux.at/pub/cvsroot/winex/programs/winedbg/msc.c
S_T_A_S_ Все, пришло мне сегодня счастье!!! Исправил поток, теперь в сайсе виден корректно сишный код, да еще до кучи стеековые переменные тоже стали показываться... короче вообще ништяк... Если найду после работы время, хочу собрать воедино все знания, которые получил, пока ковырял формат. Ато обидно получается - щас все помню, а теперь дали другой проект - все забуду, а потом если что опять вспоминай... Накатаю доку как смогу, если не лень - ты покритикуй, если найдешь ошибки, вообще здорово, надо же составить максимально близкое к правде представление про этого пушного зверька...
Кстати, всех хочу предостеречь от использования DIA библиотеки, которая идет с дистрибом седьмой студии. Ребята из фирмы "Маленькие программки" как-то так хитро ее наботали, что после освобождениЯ указателей на интерфейс ( возможно путаюсь в терминологии, т.к. в COM не силен ) память не освобождается. моя прога кушала до 350 мб памяти... Та же композиция, только вид сбоку, но в 8-й студии с новой версией DLL скромно потребляет 10 мб. Вот такие дела...
StatusError Если появится желание обнародовать результаты своих трудов - это просто замечательно. Я конечно же с удовольствием почитаю, вот только найду ли ошибки - хз
S_T_A_S_ Желание-то есть, вто только когда я смогу это написать... Щас на работе имею тесные половые отношения с айсом по 12 часов... вчером сил нет... Ну когда-нидь осилю...