Как опция отладки -g изменяет двоичный исполняемый файл? - PullRequest
66 голосов
/ 18 сентября 2008

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

Ответы [ 7 ]

60 голосов
/ 18 сентября 2008

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

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

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

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

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

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

8 голосов
/ 18 сентября 2008

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

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

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

Проверьте документацию вашего компилятора для получения дополнительной информации:
Но пример для DevStudio:

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

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

7 голосов
/ 18 сентября 2008

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

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

3 голосов
/ 18 сентября 2008

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

3 голосов
/ 18 сентября 2008

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

3 голосов
/ 18 сентября 2008

Этот вопрос частично совпадает с вопросом с другой стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...