GCC отладочная информация - PullRequest
1 голос
/ 01 марта 2011

Я использую кросс-компилятор GCC ARM (arm-none-eabi-*) и использую проприетарный отладчик. Отладчик может выделить результирующую сборку для выбранной исходной строки. Используя nm и objdump, я вижу, что бинарный файл имеет более одного .debug_* раздела. Очевидно, что можно сделать вывод, что отладчик использует информацию, содержащуюся в этих разделах, для сопоставления строк исходного кода с разборкой (и наоборот). Но я бы хотел как. Я хотел бы знать, какую информацию содержат эти разделы, как они связаны и как их использовать. Короче говоря, как бы я прочитал разделы и использовал их, если бы мне пришлось написать отладчик (или, по крайней мере, инструмент, который может отображать эти сопоставления: от источника к дизассемблированию и обратно, количество строк дизассемблирования на строку исходного кода) , Предположим, нулевая оптимизация компиляции.

Предположительно, есть какой-то документ, описывающий формат этих разделов?

1 Ответ

1 голос
/ 14 апреля 2012

Разделы .debug_ * содержат данные в формате, описанном стандартом отладки DWARF.В стандарте есть веб-сайт, на котором можно загрузить стандартную спецификацию: http://www.dwarfstd.org/

Для анализа сохраненного формата (который сильно сжат для экономии места) доступны библиотеки, например, libdwarf, доступный здесь: http://reality.sgiweb.org/davea/dwarf.html

Короче говоря, различные разделы содержат различные аспекты исходной программы и то, как они отображаются на архитектуру целевой машины (код и адреса данных).Информация, которая обычно теряется в процессе компиляции, представлена ​​деревом записей отладочной информации, которые представляют собой структуры с идентифицирующим тегом и различными атрибутами.Например, DIE для объявления переменной представлен DIE с тегом DW_TAG_variable и может иметь такие атрибуты, как: имя, файл / строка / столбец, в котором он объявлен, место в памяти в объектном файле и т. Д.

Разделы .debug_info и .debug_abbrev вместе представляют дерево записей отладочной информации.Раздел .debug_line содержит информацию, которая позволяет отладчику восстановить полную строку исходного кода, отображающую таблицу, по адресу кода объекта (и содержит другую информацию, например, является ли строка исходного кода началом оператора и началомбазовый блок и т. д.).

Другие разделы содержат информацию о кадре вызова и таблицы ускоренного поиска для быстрого поиска переменных DIE и типов по имени и многое другое.Это все описано в стандарте.

...