WikiDer > База данных программы

Program database
База данных программы
Расширение имени файла
.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 байтов.

Заголовок потока 3 PDB (struct NewDBIHdr)[1]
КомпенсироватьРазмерИмяОписание
04ПодписьИдентификатор заголовка, == 0xFFFFFFFF
44HeaderVersionВерсия заголовка
84Возраст
122snGSSyms
142usVerAll
 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    };
162snPSSyms
182usVerPdbDllBuildверсия сборки pdb dll, которая построила этот pdb последней
202snSymRecs
222VerPdbDllRBldrbld версия dll pdb, которая построила этот pdb последней
244cbGpModiразмер подпотока rgmodi
284cbSCразмер подпотока вклад раздела
324cbSecMapразмер карты раздела
364cbFileInfoразмер потока информации о файле
404cbTSMapразмер подпотока Type Server Map
444iMFCИндекс MFC
484cbDbgHdrразмер необязательной информации DbgHdr, добавляемой в конец потока
524cbECInfoколичество байтов в субпотоке EC, или 0, если не включены моды EC
562флаги
1   структура _flags {2       USHORT  fIncLink:1;     // истина, если внутренняя ссылка (действительно, только если присутствуют переходники ilink)3       USHORT  fStripped:1;    // истина, если PDB :: CopyTo удалил личные данные4       USHORT  fCTypes:1;      // истина, если этот PDB использует CTypes.5       USHORT  неиспользованный:13;      // зарезервировано, должно быть 0.6   } флаги;
582wMachineИдентификатор машины, такой же, как используемый в формате объекта COFF, например., шестнадцатеричный 8664 для Intel x86 64-бит
604ЗАРЕЗЕРВИРОВАННЫЙбудущее расширение, дополнение до 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 байта каждый.

Смотрите также

внешняя ссылка