Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

База данных программ ( 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), доступных в Microsoft Windows . Существуют также сторонние инструменты, которые также могут извлекать информацию из PDB, такие как radare2 и pdbparse.

Формат нескольких потоков [ править ]

PDB - это единый файл, который логически состоит из нескольких субфайлов, называемых потоками . Он разработан для оптимизации процесса внесения изменений в PDB, который выполняется путем компиляции и инкрементных ссылок. Потоки могут быть удалены, добавлены или заменены без перезаписи других потоков, а также минимизированы изменения в метаданных, которые описывают потоки.

PDB организован в виде страниц фиксированного размера , обычно размером 1 КБ, 2 КБ или 4 КБ, пронумерованных последовательно, начиная с 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 байтов.

  • Информация о модуле переменной длины. Общий размер в заголовке выше. Один из них для каждого объектного модуля, используемого компоновщиком.
    • Открыто, 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 байта каждый.

См. Также [ править ]

Внешние ссылки [ править ]

  • Формат PDB задокументирован здесь Информация от Microsoft о формате PDB.
  • Документация Microsoft MSDN по DIA
  • Как проверить содержимое файла базы данных программы (PDB)
  • Символы и файлы символов, MSDN
  • Что внутри файла PDB? / Блог группы разработчиков Visual C ++
  • Структура PDB согласно LLVM