Pdb-файл, что это такое

Обновлено: 04.07.2024

Формат файлов PDBx/mmCIF и словарь данных являются основой для депонирования данных wwPDB, аннотирования и архивирования данных PDB всех поддерживаемых экспериментальных методов.

Первоначальный формат и словарь CIF (Crystallographic Information File) были разработаны для архивирования кристаллографических экспериментов с малыми молекулами. В 1997 году словарь был расширен (mmCIF) и теперь включает в себя элементы данных, относящиеся к макромолекулярным кристаллографическим экспериментам (PDBx/mmCIF). Этот формат преодолевает ограничения устаревшего формата файла PDB и поддерживает данные, представляющие большие структуры, сложную химию, а также новые и гибридные экспериментальные методы. Устаревший формат файла PDB больше не изменяется и не расширяется для поддержки нового содержимого. Поскольку формат PDBx/mmCIF продолжает развиваться, файлы формата PDB устареют.

PDBx/mmCIF — это мощный инструмент. PDBx/mmCIF явно документирует все взаимосвязи между общими элементами данных (например, идентификаторами атомов и остатков), что позволяет программным приложениям оценивать и проверять ссылочную целостность с любой записью PDB, а также сопоставляет информацию между остаточными последовательностями экспериментального образца и координатами модели. Словарь обмена mmCIF/PDBx предоставляет метаданные (например, типы данных, допустимые диапазоны, контролируемые словари).

Поддерживается приложениями для визуализации, такими как Jmol, Chimera и OpenRasMol, и системами определения структуры, такими как CCP4 и Phenix.

Основы синтаксиса и формата

Формат PDBx/mmCIF использует набор символов ASCII.

Все элементы данных идентифицируются по имени, начинаются с символа подчеркивания и состоят из имени категории и имени атрибута. Название категории отделяется от имени атрибута точкой:

Такую комбинацию категории и атрибута можно назвать токеном mmCIF.

Категории данных представлены в двух стилях: ключ-значение и табличный.

В стиле "ключ-значение" за токеном mmCIF непосредственно следует соответствующее значение. В следующем примере показаны параметры элементарной ячейки из записи 4hhb:

_cell.entry_id 4HHB
_cell.length_a 63,150
_cell.length_b 83,590
_cell.length_c 53,800
_cell.angle_alpha 90,00
_cell.angle_beta 99,34
_cell.angle_gamma 90,00
_cell.Z_PDB 4

Табличный стиль используется, когда для каждого токена имеется несколько значений. В этом стиле за токеном loop_ следуют строки имен элементов данных, а затем значения данных, разделенные пробелами. В следующем примере показано начало записей координат от записи 4hhb. Здесь элементы данных в категории atom_site используются для описания идентификаторов и атомных координат атомов в записи:

loop_
_atom_site.group_PDB
_atom_site.id
_atom_site.type_symbol
_atom_site.label_atom_id
_atom_site.label_alt_id
_atom_site.label_comp_id
_atom_site.label_asym_id
_atom_site.label_entity_id
_atom_site.label_seq_id
_atom_site.pdbx_PDB_ins_code
_atom_site.Cartn_x
_atom_site.Cartn_y
_atom_site.Cartn_z
_atom_site .occupancy
_atom_site.B_iso_or_equiv
_atom_site.pdbx_formal_charge
_atom_site.auth_seq_id
_atom_site.auth_comp_id
_atom_site.auth_asym_id
_atom_site.auth_atom_id
_atom_site. pdbx_PDB_model_num
ATOM 1 NN . ВАЛ А 1 1 ? 6,204 16,869 4,854 1,00 49,05 ? 1 VAL A N 1
ATOM 2 C CA . ВАЛ А 1 1 ? 6,913 17,759 4,607 1,00 43,14 ? 1 VAL A CA 1
АТОМ 3 C C . ВАЛ А 1 1 ? 8,504 17,378 4,797 1,00 24,80 ? 1 ВАЛ А С 1
АТОМ 4 О О . ВАЛ А 1 1 ? 8,805 17,011 5,943 1,00 37,68 ? 1 ВАЛ А О 1
АТОМ 5 C CB . ВАЛ А 1 1 ? 6,369 19,044 5,810 1,00 72,12 ? 1 VAL A CB 1
ATOM 6 C CG1 . ВАЛ А 1 1 ? 7,009 20,127 5,418 1,00 61,79 ? 1 VAL A CG1 1
ATOM 7 C CG2 . ВАЛ А 1 1 ? 5,246 18,533 5,681 1,00 80,12 ? 1 ЗНАЧ А CG2 1

Имя первого элемента данных соответствует первому значению данных, второе — следующему, и так далее в каждой строке данных. Например, третий элемент данных _atom_site.type_symbol соответствует типу атома, указанному в столбце 13. Затем список элементов данных «прокручивается» для каждой строки значений данных.

Примеры формата

Одним из основных преимуществ формата PDBx/mmCIF является то, что он не накладывает ограничений на количество атомов, остатков или цепей, которые могут быть представлены в одной записи PDB.

Все элементы данных в текущем формате PDB имеют соответствующие элементы данных в формате PDBx/mmCIF, и каждый элемент данных точно определен в словаре данных обмена PDBx. Подробно описаны соответствия между записями в формате файла PDB и элементами данных, определенными в словаре PDBx/mmCIF.

Например, запись PDB, содержащая авторов показания, AUTHOR:

Представлен в PDBx/mmCIF с элементами данных в категории audit_author:

_audit_author.name
_audit_author.pdbx_ordinal
'Ферми, Г.' 1
'Перуц, М.Ф.' 2

PDBx/mmCIF упорядочивает информацию по категориям, содержащим связанные элементы данных. В приведенном выше примере категория audit_author содержит элементы данных .name и .pdbx_ordinal. Элемент данных .name содержит фамилию и инициалы авторов депонирования. Элемент данных .pdbx_ordinal определяет порядок имени автора в списке авторов.

Категория — это табличная структура данных, в которой элементы данных — это строки, а хранимая информация — столбцы:

Если в элементе данных или группе элементов данных в одной и той же категории есть несколько столбцов, категории предшествует токен loop_. За списком имен элементов данных могут следовать повторяющиеся строки значений данных.

Например, записи JRNL файла PDB для структуры 4HHB включают первичную ссылку с четырьмя авторами:

JRNL AUTH G.FERMI, MFPERUTZ, B.SHAANAN, R.FOURME
JRNL TITL КРИСТАЛЛИЧЕСКАЯ СТРУКТУРА ЧЕЛОВЕЧЕСКОГО ДЕОКСИГЕМОГЛОБИНА ПРИ 1,74 A
JRNL TITL 2 RESOLUTION
JRNL REF J. МОЛ.БИОЛ. V. 175 159 1984
JRNL REFN ISSN 0022-2836
JRNL PMID 6726807
JRNL DOI 10.1016/0022-2836(84)90472-8

Затем файл формата PDB продолжается несколькими дополнительными ссылками, такими как:

Категория _citation_author перебирает авторов различных ссылок:

loop_
_citation_author.citation_id
_citation_author.name
_citation_author.ordinal
primary 'Fermi, G.' 1
первичный 'Перуц, М.Ф.' 2
первичный 'Шаанан, Б.' 3
основной 'Fourme, R.' 4
1 'Перуц, М.Ф.' 5
1 'Хаснайн С.С.' 6
1 'Герцог, П.Дж.' 7
1 'Сесслер, Дж.Л.' 8
1 'Хан, Дж. Э.' 9
2 'Ферми, Г.' 10
2 'Перуц, М.Ф.' 11
3 'Перуц, М.Ф.' 12
4 'Тенейк, Л.Ф.' 13
4 'Арноне, А.' 14
5 'Ферми, Г.' 15
6 'Мюрхед, Х.' 16
6 'Грир, Дж.' 17

Остальная информация, содержащаяся в записях JRNL, включена в соответствующие элементы данных категории _citation, такие как:

_citation.title
_citation.journal_abbrev
_citation.journal_volume
_citation.page_first
_citation.page_last
_citation.year

Категории имеют явные отношения друг с другом. Группа категорий — это именованная коллекция категорий. Группы категорий обычно используются для организации групп связанных категорий. Например, все категории mmCIF, содержащие библиографическую информацию, являются членами группы категорий citation_group. В эту группу входят категории citation, citation_author и citation_editor.

Объекты

Одним из понятий, на котором основан формат PDBx/mmCIF, являются сущности. Объект представляет собой химически обособленную часть структуры, представленную в файле данных PDBx/mmCIF. Элементы данных в категории _entity описывают химический состав и идентичность исследуемых молекул. В любой конкретной записи может быть несколько копий данного объекта.

Например, структура 4hhb содержит две копии альфа-цепи гемоглобина (или цепи A и C) и две копии бета-цепи (или цепи B и D). Запись также содержит четыре гемовые группы. В файле PDBx/mmCIF две альфа-цепи считаются одним объектом, две бета-цепи — другим, а гемовые группы — третьим. Вода и ионы фосфата составляют четвертую и пятую сущности:

Loop_
_entity.id
_entity.type
_entity.src_method
_entity.pdbx_description
_entity.formula_weight
_entity.pdbx_number_of_molecules
_entity.pdbx_ec
_entity.pdbx_mutation
_entity.pdbx_fragment
_entity.details
1 полимерный человек 'ГЕМОГЛОБИН (ДЕОКСИ) (АЛЬФА-ЦЕПЬ)' 15150.353 2 ? ? ? ?
2 полимерный человек 'ГЕМОГЛОБИН (ДЕОКСИ) (БЕТА ЦЕПЬ)' 15890.198 2 ? ? ? ?

3 неполимерный син 'ПРОТОПОРФИРИН IX, СОДЕРЖАЩИЙ FE' 616.487 4 ? ? ? ?
4 неполимерный син 'ФОСФАТ-ИОН' 94,971 2 ? ? ? ?

5 вода натуральная вода 18.015 221 ? ? ? ?

Каждому объекту присваивается уникальный числовой идентификатор (в категории entity.id).

Отношения между родителями и детьми

Когда элементы данных встречаются в нескольких категориях, создается связь родитель-потомок. Чаще всего это происходит с метками и идентификаторами, которые повторно используются в словаре. Например, идентификатор объекта _entity.id, определенный в категории ENTITY, является родительским определением этого элемента. Этот идентификатор повторно используется в категории ATOM_SITE как элемент _atom_site.label_entity_id. В этом случае элемент данных в категории ATOM_SITE определяется как дочерний элемент элемента данных в категории ENTITY.

Словарь химических компонентов

Химические описания всех мономеров и лигандов в структурах PDB представлены в формате PDBx/mmCIF в Словаре химических компонентов. Коллекция категорий данных PDBx/mmCIF, используемых в Словаре химических компонентов, находится в группе категорий CHEM_COMP_DICTIONARY.

Например, в определении PDBx/mmCIF для химического компонента HEM ("ПРОТОПОРФИРИН IX, СОДЕРЖАЩИЙ FE") определена группа:

_chem_comp.id HEM
_chem_comp.name "ПРОТОПОРФИРИН IX, СОДЕРЖАЩИЙ FE"
_chem_comp.type НЕПОЛИМЕР
_chem_comp.pdbx_type HETAIN
_chem_comp.formula "C34 H32 Fe N4 O4"
_chem_comp.mon_nstd_parent_comp_id ?
_chem_comp.pdbx_synonyms HEME
_chem_comp.pdbx_formal_charge 0
_chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2016-01-20
_chem_comp.pdbx_ambiguous_chem_flag Y
_chem_comp.pdbx_ambiguous_chem_flag Y
pdbx_release_status REL
_chem_comp.pdbx_replaced_by ?
_chem_comp.pdbx_replaces MHM
_chem_comp.formula_weight 616.487
_chem_comp.one_letter_code ?
_chem_comp.three_letter_code HEM _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details Corina _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code 3IA3 _chem_comp.pdbx_subcomponent_list ?
_chem_comp.pdbx_processing_site RCSB

За этим определением следуют элементы данных, описывающие идентичность и идеальное положение каждого атома в группе.

Примеры программных пакетов, генерирующих файлы формата PDBx/mmCIF, включают

Файлы формата PDBx/mmCIF могут быть созданы в следующих программных пакетах:

Что такое файл PDB и как исключить его из папки выпуска при перестроении решения?

pdb — это файл базы данных программы, который создается при компиляции. Этот файл содержит отладочную информацию и информацию о состоянии проекта, которая позволяет выполнять инкрементную компоновку отладочной конфигурации вашей программы.

5 ответов 5

Файл PDB содержит информацию, с которой может работать отладчик. В сборке Release меньше информации, чем в сборке Debug. Но если вы хотите, чтобы он вообще не создавался, перейдите к свойствам сборки вашего проекта, выберите конфигурацию выпуска, нажмите «Дополнительно» и в разделе «Информация об отладке» выберите «Нет».


@Jon Помогает ли это предоставить пользователю дополнительную информацию, если приложение аварийно завершает работу? (т. е. помогает ли это с окном JIT, а не «Эта программа должна быть завершена, отправить отчет об ошибке Windows»)

Имейте в виду, что вам, вероятно, следует включить их в отладочные выпуски, поскольку это позволяет отслеживать исключения до определенной строки кода. Без символов в файле pdb вам будет трудно определить конкретные проблемы для их решения. Вам также не обязательно исключать их из сборок релизов, так как иногда дополнительная информация в большом отчете может быть очень полезной.

@Jared: Да, он включает трассировку стека исключения, которая указывает на конкретную функцию и строку кода.

@Jared: Что вы подразумеваете под "окном JIT"? Маловероятно, что пользователь получит гораздо больше информации, но может позволить при необходимости подключить отладчик к сборке релиза. Однако обычно вы не включаете его для приложений конечного пользователя. Конечно, то, что он скопирован в папку Release, не означает, что вы должны отправить его в программу установки.

Сначала я задал себе вопрос "Нужен ли мне файл PDB, развернутый на компьютере моего клиента?", и, прочитав этот пост, решил исключить этот файл.

Все работало нормально до сегодняшнего дня, когда я пытался выяснить, почему в окне сообщения, содержащем Exception.StackTrace, отсутствовала информация о номере файла и строки, необходимая для устранения неполадок с исключением. Я перечитал этот пост и нашел ключевую информацию: хотя PDB не требуется для запуска приложения, необходимо, чтобы номера файлов и строк присутствовали в строке StackTrace. Я включил файл PDB в исполняемую папку, и теперь все в порядке.



PDB — это сокращение от Program-Debug Data Base. Как следует из названия, это репозиторий (постоянное хранилище, такое как базы данных) для хранения информации, необходимой для запуска вашей программы в режиме отладки. Он содержит много важной информации, необходимой для отладки кода (в Visual Studio), например. в каких точках вы поместили точки останова, где вы ожидаете, что отладчик прервется в Visual Studio.

Вот почему Visual Studio не удается достичь точек останова, если вы удаляете файлы *.pdb из каталога отладки. Отладчик Visual Studio также может указать точный номер строки файла кода, в которой произошло исключение в трассировке стека. Это можно сделать только с помощью файлов *.pdb. Таким образом, файлы PDB очень полезны для целей отладки.

Как правило, не рекомендуется исключать создание файлов *.pdb.С точки зрения производственного выпуска вам следует создавать файлы PDB, но не отправлять их на сайт заказчика в установщике продукта. Сохраните все сгенерированные файлы PDB на сервере символов, откуда их можно будет использовать/ссылаться на них в будущем, если потребуется.

Это особенно важно в сценариях, в которых вы отлаживаете проблемы сбоя процесса. При анализе файлов аварийного дампа, если исходные файлы *.pdb, созданные в процессе сборки, не сохраняются, Visual Studio не сможет определить точную строку кода, которая вызывает сбой.

Если вы по-прежнему хотите полностью отключить создание файлов *.pdb для любого выпуска, перейдите в свойства проекта -> вкладка «Сборка» -> нажмите кнопку «Дополнительно» -> выберите «Нет» в раскрывающемся списке «Информация об отладке» - > нажмите OK, как показано на снимке ниже.

Примечание. Этот параметр необходимо настроить отдельно для конфигураций сборки "Отладка" и "Выпуск".

Спасибо, что посетили одно из самых популярных произведений, которые я когда-либо писал! Основываясь на вопросах, я написал несколько дополнительных статей, которые могут оказаться полезными для расширения ваших знаний о PDB после прочтения этой статьи.

Если у вас есть какие-либо вопросы о файлах PDB, задайте вопрос в комментариях, напишите мне (john AT wintellect DOT com) или задайте вопрос в Твиттере @JohnWintellect.

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

Что я хочу здесь сделать, так это собрать в одном месте то, что каждый, кто занимается разработкой в ​​операционной системе Microsoft, должен знать, когда речь идет о файлах PDB. Эта информация также применима как к нативным, так и к управляемым разработчикам, хотя я упомяну трюк, специфичный для управляемых разработчиков. Я начну с разговора о хранилище файлов PDB, а также о содержимом. Поскольку отладчик использует PDB-файлы, я расскажу, как именно отладчик находит правильный PDB-файл для вашего двоичного файла. Наконец, я расскажу о том, как отладчик ищет исходные файлы при отладке, и покажу вам любимый прием, связанный с тем, как отладчик находит исходный код.

Прежде чем мы перейдем к делу, мне нужно дать определение двум важным терминам. Сборка, которую вы делаете на своем компьютере для разработки, является частной сборкой. Сборка, выполненная на машине сборки, является общедоступной сборкой. Это важное различие, потому что отлаживать бинарные файлы, которые вы собираете локально, легко, проблемы всегда возникают из-за общедоступных сборок.

Самая важная вещь, которую должны знать все разработчики: файлы PDB так же важны, как и исходный код! Да, это специально красное и жирное. Я был в бесчисленном количестве компаний, чтобы помочь им отладить эти ошибки, которые стоят сотни тысяч долларов, и никто не может найти файлы PDB для сборки, работающей на рабочем сервере. Без соответствующих файлов PDB вы только что сделали свою задачу отладки практически невыполнимой. Приложив огромные усилия, мы с коллегами из Wintellectuals можем найти проблемы без правильных файлов PDB, но это сэкономит вам много денег, если у вас есть нужные файлы PDB.

Большинству из вас, читающих это, также потребуется выполнить один подготовительный шаг, прежде чем помещать файлы PDB на сервер символов. Этот шаг заключается в запуске инструментов исходного сервера в общедоступных файлах PDB, что называется исходным индексированием. Индексация включает в себя команды управления версиями для извлечения точного исходного файла, используемого в этой конкретной общедоступной сборке. Таким образом, когда вы отлаживаете общедоступную сборку, вам никогда не придется беспокоиться о поиске исходного файла для этой сборки. Если вы работаете в команде из одного или двух человек, иногда вы можете обходиться без шага исходного сервера. Для остальных из вас прочитайте мою статью в журнале MSDN об исходном сервере, чтобы узнать, как его использовать.

В остальной части этой записи предполагается, что вы настроили индексирование серверов символов и исходных серверов. Хорошие новости для тех из вас, кто будет использовать TFS 2010: сервер сборки по умолчанию будет иметь задачу сборки для индексирования исходного кода и копирования сервера символов как часть вашей сборки.

Одна из жалоб, которые я слышал от некоторых команд на установку сервера символов, заключалась в том, что их программное обеспечение слишком большое и сложное. Я должен признать, что когда я слышу, как люди говорят, что это переводится для меня как «Моя команда не работает». Ваше программное обеспечение не может быть больше и сложнее, чем все, что делает Microsoft. Они исходят из индекса и сохраняют каждую сборку всех продуктов, которые они отгружают, на сервере символов. Это означает, что все, от Windows до Office, SQL, игр и всего, что между ними, хранится в одном центральном месте. Я предполагаю, что здание 34 в Редмонде — это не что иное, как диски SAN для хранения всех этих файлов, и все в этом здании готовы поддерживать эти SAN.Удивительно иметь возможность отлаживать что-либо внутри Microsoft, и вам никогда не придется беспокоиться о символах или исходном коде (при условии, что у вас есть соответствующие права на это исходное дерево).

Заканчивая обсуждение ключевой инфраструктуры, позвольте мне перейти к тому, что содержится в PDB и как их находит отладчик. Фактический формат файла PDB является строго охраняемым секретом, но Microsoft предоставляет API для возврата данных для отладчиков. Собственный PDB-файл C++ содержит довольно много информации:

  • Общие, частные и статические адреса функций
  • Имена и адреса глобальных переменных
  • Имена параметров и локальных переменных и смещения, где их найти в стеке
  • Введите данные, состоящие из классов, структур и определений данных.
  • Данные с пропуском указателя кадра (FPO), которые являются ключом к обходу собственного стека на платформе x86.
  • Имена исходных файлов и их строки

Когда вы загружаете модуль в адресное пространство процесса, отладчик использует две части информации, чтобы найти соответствующий PDB-файл. Во-первых, это, очевидно, имя файла. Если вы загружаете ZZZ.DLL, отладчик ищет ZZZ.PDB. Чрезвычайно важная часть заключается в том, как отладчик узнает, что это точно соответствующий PDB-файл для этого двоичного файла. Это делается с помощью GUID, встроенного как в файл PDB, так и в двоичный файл. Если GUID не совпадает, вы точно не будете отлаживать модуль на уровне исходного кода.

Однако вы можете посмотреть значение GUID в двоичном файле. С помощью инструмента командной строки DUMPBIN, входящего в состав Visual Studio, вы можете составить список всех частей ваших Portable Executable (PE) файлов. Чтобы запустить DUMPBIN, откройте командную строку Visual Studio 2008 из меню программы, так как вам потребуется установить переменную среды PATH, чтобы найти DUMPBIN EXE. Кстати, если вам интересно узнать больше об информации, которую показывает вам DUMPBIN, я настоятельно рекомендую подробные статьи о PE-файле Мэтта Пьетрека в выпусках MSDN Magazine за февраль 2002 г. и март 2002 г.

Существует множество параметров командной строки для DUMPBIN, но тот, который показывает нам GUID сборки, — это /HEADERS. В статьях Pietrek будет объяснен вывод, но для нас важным является вывод каталогов отладки:

Каталоги отладки
Время Тип Размер Указатель RVA
——— —— ——— ——— ———
4A03CA66 cv 4A 000025C4 7C4 Формат: RSDS,
, 1,
C:junkstuffHelloWorldobjDebugHelloWorld.pdb

На другой машине я видел, как многие разработчики после использования GACUTIL помещали сборку в GAC делали это, открывая командное окно и копаясь в C:WINDOWSASSEMBLY, чтобы найти физическое расположение сборки на диск. Хотя в будущем это может быть изменено, сборка, скомпилированная для любого ЦП, на самом деле находится в каталоге, подобном следующему:

Example — это имя сборки, 1.0.0.0 — номер версии, а 682bc775ff82796a — значение токена открытого ключа. После того, как вы определили фактический каталог, вы можете скопировать файл PDB в этот каталог, и отладчик загрузит его.

Кстати, если вы ищете DEVPATH в любой поисковой системе в Интернете, одна из первых записей — это устаревшая запись в блоге Сюзанны Кук, в которой говорится, что Microsoft избавляется от DEVPATH. Это уже не так. Как и в случае любой записи в блоге, обратите внимание на дату в блоге Сюзанны: 2003 год. Это соответствует 1670 летам в Интернете.

Чтобы использовать DEVPATH, вы должны сначала создать каталог с правами доступа на чтение для всех учетных записей и, по крайней мере, доступ на запись для вашей учетной записи разработки. Этот каталог может находиться где угодно на машине. Второй шаг — установить общесистемную переменную среды DEVPATH, значением которой является созданный вами каталог. В документации по DEVPATH это не проясняется, но задайте переменную среды DEVPATH, прежде чем делать следующий шаг.

Последний пункт, который должен знать каждый разработчик о файлах PDB, — это то, как информация об исходном файле хранится в файле PDB. Для общедоступных сборок, на которых были запущены инструменты индексации исходного кода, хранилище — это команда управления версиями, позволяющая поместить этот исходный файл в установленный вами исходный кеш. Для частных сборок сохраняется полный путь к исходным файлам, которые компилятор использовал для создания двоичного файла. Другими словами, если вы используете исходный файл MYCODE.CPP в C:FOO, то, что встроено в файл PDB, — это C:FOOMYCODE.CPP. Вероятно, вы уже подозревали об этом, но я просто хотел прояснить ситуацию.

В идеале все общедоступные сборки автоматически индексируются исходным кодом и сохраняются на вашем сервере символов, поэтому вам больше не нужно даже думать о том, где находится исходный код. Тем не менее, некоторые команды не выполняют индексацию исходного кода в PDB-файлах до тех пор, пока они не проведут дымовые тесты или другие благословения, чтобы убедиться, что сборка достаточно хороша для использования другими.Это вполне разумный подход, но если вам нужно отладить сборку до того, как ее исходный код будет проиндексирован, вам лучше перенести этот исходный код на тот же диск и структуру каталогов, что и машина сборки, иначе у вас могут возникнуть проблемы с отладкой исходного кода. уровень. Хотя и в отладчике Visual Studio, и в WinDBG есть параметры для установки исходных каталогов поиска, мне было трудно сделать это правильно.

Для небольших проектов это не проблема, потому что всегда есть достаточно места для вашего исходного кода. Где жизнь сложнее, так это в более крупных проектах. Что вы собираетесь делать, если у вас есть 30 МБ исходного кода, а на диске C: осталось всего 20 МБ? Было бы неплохо иметь возможность управлять путем, хранящимся в файле PDB?

Хотя мы не можем редактировать файлы PDB, есть простой способ управлять путями, помещенными в файлы PDB: SUBST.EXE. Что делает SUBST, так это связывает путь с буквой диска. Если вы перетащите свой исходный код в C:DEV и выполните «SUBST R: C:DEV», диск R: теперь будет отображать на своем верхнем уровне те же файлы и каталоги, если вы набрали «DIR C:DEV». Вы также увидите диск R: в Проводнике как новый диск. Вы также можете добиться эффекта перехода от диска к пути, сопоставив диск с общим каталогом в Проводнике. Я лично предпочитаю подход SUBST, потому что он не требует каких-либо общих ресурсов на машине. В то время как некоторые из вас думают, что вы можете делиться через $, некоторые организации отключают эту функцию.

Что вы будете делать на машине сборки, так это установить элемент запуска, который выполняет вашу конкретную команду SUBST. Когда учетная запись системы сборки войдет в систему, ей будет доступна новая буква диска, и именно там вы будете выполнять свои сборки. С полным контролем над диском и корнем, встроенным в файл PDB, все, что вам нужно сделать, чтобы настроить исходный код на тестовой машине, — это извлечь его из любого места и выполнить выполнение SUBST, используя ту же букву диска, что и машина сборки. использовал. Теперь больше не нужно думать о сопоставлении исходников в отладчике.

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

PDB (база данных программ) – это формат файлов, разработанный корпорацией Майкрософт и содержащий отладочную информацию, которую могут использовать отладчики и другие инструменты. Поскольку в Windows существуют официально поддерживаемые API для запроса отладочной информации из PDB, даже если пользователь не понимает внутренностей формата файла, для Windows была создана большая экосистема инструментов для использования этого формата. Чтобы Clang мог создавать программы, которые могут взаимодействовать с этими инструментами, нам необходимо самим создавать файлы PDB.

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

В этом руководстве описывается, что мы знаем о формате файлов PDB на сегодняшний день. Макет файла, различные содержащиеся в нем потоки, формат отдельных записей внутри и многое другое.

Мы хотели бы выразить нашу сердечную благодарность Microsoft, без которой мы бы не достигли того, что имеем сегодня. Большая часть знаний, содержащихся в этом руководстве, была получена путем чтения кода, опубликованного Microsoft в их репозитории GitHub.

Макет файла¶

Если не указано иное, все числовые значения закодированы с прямым порядком байтов. Если вы видите такой тип, как uint16_t или uint64_t, всегда предполагайте, что это прямой порядок байтов!

Контейнер MSF¶

Файл PDB представляет собой файл MSF (многопоточный формат). Файл MSF — это «файловая система в файле». Он содержит несколько потоков (также называемых файлами), которые могут представлять произвольные данные, и эти потоки разделены на блоки, которые не обязательно могут располагаться непрерывно в файле-контейнере MSF. Кроме того, MSF содержит каталог потоков (также известный как MFT), в котором описывается, как потоки (файлы) размещаются в MSF.

Дополнительную информацию о формате контейнера MSF, каталоге потока и макете блока см. в разделе Формат файла MSF .

Потоки¶

Формат PDB содержит ряд потоков, описывающих различную информацию, такую ​​как типы, символы, исходные файлы и файлы компиляции (например,объектные файлы) программы, а также некоторые дополнительные потоки, содержащие хеш-таблицы, которые используются отладчиками и другими инструментами для обеспечения быстрого поиска записей и типов по имени, а также другую различную информацию о том, как программа была скомпилирована, например конкретную цепочку инструментов. используется и многое другое. Сводка потоков, содержащихся в файле PDB, выглядит следующим образом:

  • Индекс фиксированного потока 0
  • Предыдущий каталог потоков MSF
  • Индекс фиксированного потока 1
  • Основная информация о файле
  • Поля для сопоставления EXE с этой PDB
  • Сопоставление именованных потоков с индексами потоков
  • Индекс фиксированного потока 2
  • Записи типов CodeView
  • Индекс хеш-потока TPI
  • Индекс фиксированного потока 3
  • Информация о модуле/компиляции
  • Индексы отдельных потоков модулей
  • Индексы общедоступных/глобальных потоков
  • Информация о вкладе в раздел
  • Информация об исходном файле
  • Ссылки на потоки, содержащие данные FPO/PGO
  • Индекс фиксированного потока 4
  • Записи типов CodeView
  • Индекс хеш-потока IPI
  • Содержится в карте именованных потоков PDB Stream
  • Неизвестно
  • Содержится в карте именованных потоков PDB Stream
  • Сводка содержимого встроенного исходного файла (например, файлы natvis)
  • Содержится в карте именованных потоков PDB Stream
  • Глобальная таблица строк PDB, используемая для дедупликации строк
  • Содержится в потоке DBI.
  • По одному для каждой компиляции
  • Записи символов CodeView для этого модуля
  • Информация о номере строки
  • Содержится в потоке DBI.
  • Общедоступные (экспортированные) записи символов
  • Индекс общедоступного хеш-потока
  • Содержится в потоке DBI.
  • Единая комбинированная таблица символов
  • Индекс глобального хэш-потока
  • Содержится в потоке TPI.
  • Хеш-таблица для поиска записей TPI по имени
  • Содержится в потоке IPI.
  • Хеш-таблица для поиска записей IPI по имени

Дополнительную информацию о структуре каждого из них можно найти на следующих страницах:

Информационный поток PDB (он же PDB Stream) Информация о информационном потоке PDB и о том, как он используется для сопоставления PDB с EXE-файлами. PDB TPI и потоки IPI Информация о потоке TPI и содержащихся в нем записях CodeView. Поток PDB DBI (отладочная информация) Информация о потоке DBI и соответствующих подпотоках, включая подпотоки модуля, информацию об исходном файле и записи символов CodeView, содержащиеся внутри. Информационный поток модуля Информация о Информационном потоке модуля, по одному для каждой единицы компиляции, и формат символов, содержащихся в нем. Поток общедоступных символов PDB Информация о потоке общедоступных символов. Глобальный поток символов PDB Информация о глобальном потоке символов. Формат сериализованной хэш-таблицы PDB Информация о формате сериализованной хэш-таблицы, используемой внутри для представления таких вещей, как карта именованного потока и корректировщики хэша в потоке TPI/IPI .

Просмотр кода¶

CodeView — это еще один формат, который можно использовать. В то время как MSF определяет структуру всего файла, а PDB определяет набор потоков, отображаемых в файле MSF, и формат этих потоков, CodeView определяет формат записей символов и типов, которые появляются в определенных потоках. Дополнительные сведения о формате CodeView см. на страницах, посвященных записям символов CodeView и записям типов CodeView.

Читайте также: