Как опция отладки -g изменяет двоичный исполняемый файл?

StackOverflow https://stackoverflow.com/questions/89603

  •  01-07-2019
  •  | 
  •  

Вопрос

При написании кода C/C++ для отладки двоичного исполняемого файла необходимо включить опцию отладки в компиляторе/компоновщике.В случае GCC параметр -g.Когда опция отладки включена, как она влияет на двоичный исполняемый файл?Какие дополнительные данные хранятся в файле, что позволяет отладчику работать так, как он это делает?

Это было полезно?

Решение

-g указывает компилятору сохранить информацию таблицы символов в исполняемом файле.Среди прочего сюда входит:

  • имена символов
  • введите информацию для символов
  • файлы и номера строк, откуда взяты символы

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

Для некоторых компиляторов указание -g отключит определенные оптимизации.Например, icc устанавливает уровень оптимизации по умолчанию -O0 с -g, если вы явно не укажете -O[123].Кроме того, даже если вы укажете -O[123], оптимизации, предотвращающие трассировку стека, все равно будут отключены (например,удаление указателей кадров из кадров стека.Это оказывает лишь незначительное влияние на производительность).

В некоторых компиляторах -g отключит оптимизации, которые могут запутать происхождение символов (переупорядочение инструкций, развертывание цикла, встраивание и т. д.).Если вы хотите выполнить отладку с оптимизацией, вы можете использовать -g3 с gcc, чтобы обойти некоторые из этих проблем.Будет включена дополнительная отладочная информация о макросах, расширениях и функциях, которые могли быть встроены.Это может позволить отладчикам и инструментам повышения производительности сопоставить оптимизированный код с исходным кодом, но это лучшее, что можно сделать.Некоторые оптимизации действительно портят код.

Для получения дополнительной информации ознакомьтесь с Карлик, формат отладки, изначально разработанный для работы с ELF (двоичный формат для Linux и других ОС).

Другие советы

К исполняемому файлу добавляется таблица символов, которая сопоставляет имена функций/переменных с местоположениями данных, чтобы отладчики могли возвращать значимую информацию, а не просто указатели.Это не влияет на скорость вашей программы, и вы можете удалить таблицу символов с помощью команды «strip».

В дополнение к отладочной и символьной информации
Google DWARF (шутка разработчиков про ELF)

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

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

Дополнительную информацию см. в документации компилятора:
Но пример для DevStudio:

  • 0xCDCDCDCD Выделено в куче, но не инициализировано
  • 0xDDDDDDDD Освобождена куча памяти.
  • 0xFDFDFDFD Ограждения «NoMansLand» автоматически размещаются на границе кучи памяти.Никогда не следует перезаписывать.Если вы перезапишете его, вы, вероятно, выйдете из конца массива.
  • 0xCCCCCCCC Выделено в стеке, но не инициализировано

-g добавляет в исполняемый файл отладочную информацию, такую ​​как имена переменных, имена функций и номера строк.Это позволяет отладчику, например GDB, выполнять код построчно, устанавливать точки останова и проверять значения переменных.Из-за этой дополнительной информации использование -g увеличивает размер исполняемого файла.

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

Есть некоторое совпадение с этим вопрос который освещает проблему с другой стороны.

Ради интереса вы можете взломать шестнадцатеричный редактор и взглянуть на исполняемый файл, созданный с помощью -g и один без.Вы можете увидеть добавленные символы и вещи.Может поменять сборку(-S) тоже, но я не уверен.

Некоторые операционные системы (например, з/ОС) создайте «побочный файл», содержащий символы отладки.Это помогает избежать раздувания исполняемого файла дополнительной информацией.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top