Отладочный символ — это особый вид символа , который добавляет дополнительную информацию к таблице символов объектного файла , например, разделяемой библиотеки или исполняемого файла . Эта информация позволяет символьному отладчику получить доступ к информации из исходного кода двоичного файла, например, к именам идентификаторов, включая переменные и процедуры.
Символьная информация может быть скомпилирована вместе с двоичным файлом модуля или распределена в отдельном файле, или просто отброшена во время компиляции и/или компоновки .
Эта информация может быть полезна при попытке исследования и исправления сбоя приложения или любой другой ошибки. [1]
Отладочные символы обычно включают не только имя функции или глобальной переменной, но и имя файла исходного кода, в котором встречается символ, а также номер строки, в которой он определен. Другая информация включает тип символа (целое число, число с плавающей точкой, функция, исключение и т. д.), область действия ( область действия блока или глобальная область действия ), размер и, для классов, имя класса, а также методы и члены в нем.
Часть отладочной информации включает строку кода в исходном файле, которая определяет этот символ (функцию или глобальную переменную), а также символы, связанные с кадрами исключений.
Эта информация может храниться в таблице символов объектного файла, исполняемого файла или общей библиотеки либо в отдельном файле.
В некоторых системах, например, z/OS , отладочная информация содержит больше, чем просто таблицу символов, например, ADATA, обсуждаемая в § OS/390 и др., содержит исходный код.
Отладочная информация может занимать довольно много места, особенно имена файлов и номера строк. Таким образом, двоичные файлы с отладочными символами могут стать довольно большими, часто в несколько раз больше размера очищенного файла. [2] Чтобы избежать этого дополнительного размера, большинство дистрибутивов операционных систем поставляют двоичные файлы, которые очищены, т. е. из которых удалены все отладочные символы. Это достигается, например, с помощью команды strip в Unix . Если отладочная информация находится в отдельных файлах, эти файлы обычно не поставляются с дистрибутивом.
stabs был ранним форматом для отладочных символов в Unix-подобных системах. Более новый формат DWARF , для которого существуют формальные спецификации, в значительной степени вытеснил его. Спецификация позволяет любому совместимому компилятору или ассемблеру создавать отладочные символы в стандартизированном формате, а любому отладчику, например GNU Debugger (GDB), получать доступ к этим символам и отображать их.
Компиляторы для линии мэйнфреймов IBM, произошедшие от System/360, имеют опцию TEST, которая заставляет компилятор включать отладочную информацию [3] [4] [5] в объектный файл. Аналогично, редакторы Binder и linkage имеют опцию TEST, которая заставляет отладочную информацию сохраняться [6] в загрузочном модуле. Различные инструменты отладки, например, OS/360 TESTRAN, TSO TEST, имеют возможность использовать встроенные определения символов.
IBM High Level Assembler (HLASM) и другие компиляторы, работающие, например, на z/OS , имеют опцию ADATA, которая создает файл Associated data (ADATA) [7], содержащий больше информации, чем та, что создается старой опцией TEST. В частности, файл ADATA включает строки исходного кода и их метаданные.
Компиляторы Microsoft генерируют файл базы данных программы (PDB), содержащий отладочные символы. Некоторые компании поставляют PDB на своих CD/DVD для устранения неполадок, а другие компании (например, Microsoft и Mozilla Corporation ) разрешают загрузку отладочных символов из Интернета. Отладчик WinDbg и Visual Studio IDE можно настроить на автоматическую загрузку отладочных символов для динамически подключаемых библиотек Windows (DLL) по требованию. Отладочные символы PDB, которые распространяет Microsoft, включают только публичные функции, глобальные переменные и их типы данных. Mozilla Corporation имеет похожую инфраструктуру, но распространяет полную отладочную информацию.
На платформах Apple отладочные символы опционально выдаются во время процесса сборки в виде файлов dSYM. Apple использует термин «symbolicate» для обозначения замены адресов в диагностических файлах на понятные человеку значения. [8]
Символьные отладчики существовали со времен мэйнфреймов , почти с момента первого появления подходящих компьютерных дисплеев , на которых отображалась символическая отладочная информация (и даже раньше с символическими дампами на бумаге). Они не ограничивались высокоуровневыми компилируемыми языками и были доступны также для программ на языке ассемблера . Для IBM/360 они создавали объектный код (по запросу), который включал «SYM-карты». Они обычно игнорировались загрузчиком программ, но были полезны для символьного отладчика, поскольку хранились в той же программной библиотеке, что и исполняемый логический код.