WikiDer > База данных программы
Эта статья включает Список ссылок, связанное чтение или внешняя ссылка, но его источники остаются неясными, потому что в нем отсутствует встроенные цитаты. (июнь 2013) (Узнайте, как и когда удалить этот шаблон сообщения) |
Расширение имени файла | .pdb |
---|---|
Разработан | Microsoft |
Тип формата | Отлаживать |
База данных программы (PDB) это проприетарный формат файла (разработан Microsoft) для хранения отладочной информации о программе (или, как правило, программных модулях, таких как DLL или же EXE). Файлы PDB обычно имеют расширение .pdb расширение. Файл PDB обычно создается из исходных файлов во время компиляции. В нем хранится список всех символы в модуле с их адресами и, возможно, именем файла и строкой, в которой был объявлен символ. Эта символьная информация не сохраняется в самом модуле, потому что она занимает много места.
Приложения
Когда программа отлажена, отладчик загружает отладочную информацию из файла PDB и использует ее для определения местоположения символов или соотнесения текущего состояния выполнения исходного кода программы. Microsoft Visual Studio использует файлы PDB в качестве основного формата файла для отладочной информации.
Еще одно использование файлов PDB - это службы, которые собирают данные о сбоях от пользователей и связывают их с конкретными частями исходного кода, которые вызывают сбой (или участвуют в нем).
Компиляторы Microsoft при соответствующих параметрах будут хранить информацию в одной PDB о типах, найденных в скомпилированных источниках. Информация об отладке, относящаяся к каждому источнику, хранится в скомпилированном объектном файле и содержит ссылки на типы в PDB. Каждая компиляция будет добавлять в PDB любые типы, которые там еще не найдены, так что ссылки в уже скомпилированных объектных файлах остаются действительными.
Компоновщик Microsoft при соответствующих параметрах создает полностью новую базу данных PDB, которая объединяет отладочную информацию, содержащуюся в его модулях ввода, типы, на которые ссылаются эти модули, и другую информацию, генерируемую компоновщиком. Если ссылка выполняется постепенно, существующая PDB модифицируется путем добавления замены только информации, относящейся к добавленным или замененным модулям, и добавления любых новых типов, которых еще нет в PDB.
Файлы PDB обычно удаляются из дистрибутива программы. Они используются разработчиками во время отладки, чтобы сэкономить время и получить представление.
Извлечение информации
Формат PDB задокументирован здесь, информация может быть извлечена из файла PDB с помощью интерфейсов DIA (Debug Interface Access), доступных на Майкрософт Виндоус. Существуют также сторонние инструменты, которые также могут извлекать информацию из PDB, например радар2 и pdbparse
Многопоточный формат
PDB - это единый файл, который логически состоит из нескольких субфайлов, называемых потоки. Он разработан для оптимизации процесса внесения изменений в PDB, который выполняется путем компиляции и дополнительных ссылок. Потоки могут быть удалены, добавлены или заменены без перезаписи других потоков, а также минимизированы изменения в метаданных, которые описывают потоки.
PDB имеет фиксированный размер. страницы, обычно 1K, 2K или 4K, пронумерованные последовательно, начиная с 0.
Примечание: Предполагается, что вся числовая информация (например., номера потоков и страниц) хранятся в прямой форме для процессоров Intel x86. Код Python pdbparse делает это предположение.
Транслировать
Каждый поток в PDB занимает несколько страниц, которые не обязательно пронумерованы последовательно. У потока есть номер и длина. Содержимое потока - это объединение его страниц, усеченных до длины потока.
Формат метаданных
Функция метаданных PDB состоит в том, чтобы идентифицировать все составляющие потоки, указывая длину и последовательность страниц для каждого потока. Потоки нумеруются последовательно, начиная с 0. Существует также ненумерованный корневой поток, который содержит некоторые метаданные.
Заголовок
PDB начинается с заголовка, состоящего из:
- Подпись, используемая для идентификации и проверки конкретного формата. Длина подписи зависит от формата.
- Остальная часть заголовка зависит от формата, определяемого подписью.
Заголовок может быть длиннее одной страницы.
Инструменты Microsoft используют два формата PDB:
Версия 7
Подпись "Microsoft C / C ++ MSF 7.00 r n x1ADS 0 0 0"
(32 байта).
Остальная часть заголовка состоит из:
- Размер страницы, 4 байта.
- Указатель таблицы размещения, 4 байта. Смысл этого неизвестен. Кажется, есть таблица распределения, массив из 65 536 бит (8 192 байта), расположенный в конце PDB, а 1 бит означает, что страница не используется.
- Количество страниц файла, 4 байта.
- Размер корневого потока, 4 байта.
- зарезервировано, 4 байта.
- Номер страницы списка номеров страниц корневого потока. Он не указывает расположение самого корневого потока, только страницы, содержащей структуру, указывающую на его страницы. На этой странице список номеров страниц корневого потока указывает страницы, на которых хранится корневой поток. Он содержит 4 байта на страницу, чего достаточно для покрытия указанного выше размера корневого потока.
Корневой поток
Корневой поток описывает все потоки PDB, начиная с потока 0. Его содержимое зависит от версии формата PDB.
Версия 2
Корневой поток состоит из:
- Количество потоков, 2 байта.
- Зарезервировано, 2 байта.
- Для каждого потока:
- Размер потока, 4 байта.
- Зарезервировано, 4 байта.
- Для каждого потока:
- Список номеров страниц потока, 2 байта на страницу, достаточно для покрытия указанного выше размера потока.
Версия 7
Корневой поток состоит из:
- Количество потоков, 4 байта.
- Для каждого потока:
- Размер потока, 4 байта.
- Для каждого потока:
- Список номеров страниц потока, 4 байта на страницу, достаточно для покрытия указанного выше размера потока.
Содержимое потока
Инструменты Microsoft хранят разные виды информации в разных пронумерованных потоках. С некоторыми номерами потоков связан фиксированный тип информации, а другие потоки идентифицируются в вышеупомянутых потоках фиксированного типа.
Поток 1 используется для проверки того, что PDB - это тот же файл, на который имеется ссылка в потоке исполняемого или объектного файла.
- Версия, 4 байта.
- Отметка даты и времени, 4 байта.
- Возраст, 4 байта. Это количество раз, когда эта PDB изменялась с момента ее создания.
- GUID, 16 байт.
- Общая длина следующих имен, 4 байта. За ними следуют символьные строки с завершающим нулем.
Поток 2 и поток 4 информация о типах хранения. Записи фактических типов определяют типы, используемые в программе. Структуру этих записей можно найти в файле cvinfo.h, предоставленном Microsoft. Есть две разновидности записей, каждая со своим собственным набором порядковых номеров: идентификаторы типов и типы; в потоке 2 хранятся только типы, а в потоке 4 хранятся только идентификаторы типов. Индексы используются для ссылки на эти записи из записей символов и других записей типов.
- Заголовок:
- Версия, 4 байта.
- Размер заголовка, 4 байта.
- Минимальный и максимальный (последний + 1) индекс для записей типа (по 4 байта).
- Размер следующих данных, 4 байта, до конца потока.
- Информация о хэше:
- Номер потока, 2 байта с заполнением 2 байта.
- Хеш-ключ, 4 байта.
- Ведра, 4 байта.
- HashVals, TiOff и HashAdj, каждый из которых состоит из смещения и длины, каждый из 4 байтов.
- Тип записи, переменной длины, count = (максимум - минимум) из заголовка выше.
Поток 3 это каталог для других потоков. Обратите внимание, что его нет ни в версии 2, ни в PDB, созданной компилятором. Поток начинается с заголовка, который дополняется до 64 байтов.
Компенсировать | Размер | Имя | Описание |
---|---|---|---|
0 | 4 | Подпись | Идентификатор заголовка, == 0xFFFFFFFF |
4 | 4 | HeaderVersion | Версия заголовка |
8 | 4 | Возраст | |
12 | 2 | snGSSyms | |
14 | 2 | usVerAll | 1 союз { 2 структура { 3 USHORT usVerPdbDllMin : 8; // минорная версия и 4 USHORT usVerPdbDllMaj : 7; // основная версия и 5 USHORT fNewVerFmt : 1; // флаг, сообщающий нам, что у нас есть rbld, хранящийся в другом месте (старший бит исходной основной версии) 6 } Vernew; // который построил этот PDB последним. 7 структура { 8 USHORT usVerPdbDllRbld: 4; 9 USHORT usVerPdbDllMin : 7;10 USHORT usVerPdbDllMaj : 5;11 } Верольд;12 USHORT usVerAll;13 }; |
16 | 2 | snPSSyms | |
18 | 2 | usVerPdbDllBuild | версия сборки pdb dll, которая построила этот pdb последней |
20 | 2 | snSymRecs | |
22 | 2 | VerPdbDllRBld | rbld версия dll pdb, которая построила этот pdb последней |
24 | 4 | cbGpModi | размер подпотока rgmodi |
28 | 4 | cbSC | размер подпотока вклад раздела |
32 | 4 | cbSecMap | размер карты раздела |
36 | 4 | cbFileInfo | размер потока информации о файле |
40 | 4 | cbTSMap | размер подпотока Type Server Map |
44 | 4 | iMFC | Индекс MFC |
48 | 4 | cbDbgHdr | размер необязательной информации DbgHdr, добавляемой в конец потока |
52 | 4 | cbECInfo | количество байтов в субпотоке EC, или 0, если не включены моды EC |
56 | 2 | флаги | 1 структура _flags {2 USHORT fIncLink:1; // истина, если внутренняя ссылка (действительно, только если присутствуют переходники ilink)3 USHORT fStripped:1; // истина, если PDB :: CopyTo удалил личные данные4 USHORT fCTypes:1; // истина, если этот PDB использует CTypes.5 USHORT неиспользованный:13; // зарезервировано, должно быть 0.6 } флаги; |
58 | 2 | wMachine | Идентификатор машины, такой же, как используемый в формате объекта COFF, например., шестнадцатеричный 8664 для Intel x86 64-бит |
60 | 4 | ЗАРЕЗЕРВИРОВАННЫЙ | будущее расширение, дополнение до 64 байтов |
- Информация о модуле переменной длины. Общий размер в заголовке выше. Один из них для каждого объектного модуля, используемого компоновщиком.
- Открыто, 4 байта.
- Информация о символе.
- Номер раздела, 2 байта + 2 байта заполнения.
- Смещение и размер по 4 байта.
- Флаги, 4 байта.
- Номер модуля, 2 байта + 2 байта заполнения.
- CRC для данных раздела и данных перемещений, по 4 байта каждый.
- Флаги, 2 байта.
- Номер потока, 2 байта.
- Размер символов, 4 байта.
- Размер информации о старом и новом номере строки, по 4 байта.
- Количество исходных файлов, 2 байта + 2 байта заполнения.
- Смещения, 4 байта.
- niSource и niCompiler, по 4 байта каждый.
- Имя модуля, байтовая строка с завершающим нулем.
- Имя объекта, байтовая строка с завершающим нулем.
- Заполнение, кратное 4 байтам.
- Вклады в разделы, заголовки разделов, информация о файлах, карта TS и информация EC. Их размеры указаны в заголовке выше.
- Заголовок отладки,
- Номера потоков для пропуска указателя старого кадра, исключений, исправлений, сопоставлений объектов с источником и от источника, заголовков разделов, идентификаторов Token Ring, Xdata, Pdata, пропусков указателя нового кадра и происхождения заголовка раздела. 2 байта каждый.