DWARF — это широко используемый стандартизированный формат отладочных данных . DWARF изначально был разработан вместе с Executable and Linkable Format (ELF), хотя он независим от форматов объектных файлов . [1] Название — средневековое фэнтезийное дополнение к «ELF», которое не имело официального значения, хотя с тех пор в качестве бэкронима было предложено название «Debugging With Arbitrary Record Formats» . [1]
DWARF возник вместе с компилятором C и отладчиком sdb в Unix System V Release 4 (SVR4). [1]
Первая версия DWARF, как оказалось, использовала чрезмерное количество памяти, и несовместимый преемник, DWARF-2, заменил его и добавил различные схемы кодирования для уменьшения размера данных. DWARF не сразу получил всеобщее признание; например, когда Sun Microsystems приняла ELF в рамках своего перехода на Solaris , они решили продолжить использовать stabs во встраивании, известном как «stabs-in-elf». Linux последовал его примеру, и DWARF-2 не стал значением по умолчанию до конца 1990-х годов.
Рабочая группа DWARF Группы свободных стандартов выпустила версию 3 DWARF в январе 2006 года [2] , добавив (помимо прочего) поддержку пространств имен C++ , выделяемых данных Fortran 90 и дополнительные методы оптимизации компилятора .
В 2010 году комитет DWARF опубликовал версию 4 DWARF, которая предлагает «улучшенное сжатие данных, лучшее описание оптимизированного кода и поддержку новых языковых возможностей в C++». [3]
Версия 5 формата DWARF была опубликована в феврале 2017 года. [4] [5] Она «включает улучшения во многих областях: лучшее сжатие данных, отделение отладочных данных от исполняемых файлов, улучшенное описание макросов и исходных файлов, более быстрый поиск символов, улучшенная отладка оптимизированного кода, а также многочисленные улучшения функциональности и производительности».
DWARF использует структуру данных, называемую записью отладочной информации (DIE), для представления каждой переменной, типа, процедуры и т. д. DIE имеет тег (например, DW_TAG_variable , DW_TAG_pointer_type , DW_TAG_subprogram ) и атрибуты (пары ключ-значение). DIE может иметь вложенные (дочерние) DIE, образуя древовидную структуру. Атрибут DIE может ссылаться на другой DIE в любом месте дерева — например, DIE, представляющий переменную, будет иметь запись DW_AT_type, указывающую на DIE, описывающий тип переменной.
Для экономии места две большие таблицы, необходимые символическим отладчикам, представлены в виде байт-кодированных инструкций для простых специализированных конечных автоматов . Таблица номеров строк, которая сопоставляет местоположения кода с местоположениями исходного кода и наоборот, также определяет, какие инструкции являются частью прологов и эпилогов функций. Таблица информации о кадрах вызовов позволяет отладчикам находить кадры в стеке вызовов .
DWARF разделен на различные разделы, такие как .debug_info , [6] .debug_frame и т. д.
Libdwarf — это библиотека, которая обеспечивает доступ к отладочной информации DWARF в исполняемых файлах и объектных файлах. [7]
Майкл Игер, председатель комитета по стандартам DWARF, написал введение в форматы отладки и DWARF 3, Введение в формат отладки DWARF . [1]