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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Существует некоторое совпадение с этим question, которое охватывает проблему с другой стороны.

Ответ 6

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

Ответ 7

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