3.10 Варианты отладки вашей программы
Для того, чтобы сообщить GCC о необходимости вывода дополнительной информации для отладчика, в почти всех случаях достаточно добавить -g к другим параметрам. Некоторые форматы отладки могут сосуществовать (например, DWARF и CTF), если каждый из них явно включен, добавив соответствующий параметр командной строки к другим параметрам.
GCC позволяет использовать -g с -O. Сокращения, используемые оптимизированным кодом, иногда могут быть неожиданными: некоторые объявленные вами переменные могут вообще не существовать; поток управления может временно перемещаться в не ожидаемые вами места; некоторые инструкции могут не выполняться, потому что они вычисляют постоянные результаты или их значения уже известны; некоторые инструкции могут выполняться в разных местах, потому что они были перемещены из циклов. Тем не менее, отладка оптимизированного кода возможна. Это делает разумным использование оптимизатора для программ, которые могут иметь ошибки.
Если вы не используете какие-либо другие параметры оптимизации, рассмотрите возможность использования -Og (см. Параметры оптимизации) с -g. Без параметра -O некоторые этапы компиляции, которые собирают информацию, полезную для отладки, вообще не выполняются, поэтому -Og может привести к лучшему опыту отладки.
-g-
Создавать отладочную информацию в формате, родном для операционной системы (stabs, COFF, XCOFF или DWARF). GDB может работать с этой отладочной информацией.
На большинстве систем, использующих формат stabs, -g включает использование дополнительной отладочной информации, которую может использовать только GDB; эта дополнительная информация улучшает отладку в GDB, но, вероятно, приведет к сбою или отказу других отладчиков от чтения программы. Если вы хотите контролировать генерацию дополнительной информации, используйте -gstabs+, -gstabs, -gxcoff+, -gxcoff или -gvms (см. ниже).
-ggdb-
Создавать отладочную информацию для использования GDB. Это означает использование наиболее выразительного формата, доступного (DWARF, stabs или родной формат, если ни один из них не поддерживается), включая расширения GDB, если это возможно.
-gdwarf-gdwarf-version-
Создавать отладочную информацию в формате DWARF (если это поддерживается). Значение version может быть 2, 3, 4 или 5; по умолчанию используется версия 5 для большинства целей (за исключением VxWorks, TPF и Darwin/Mac OS X, для которых используется версия 2, и AIX, для которой используется версия 4).
Обратите внимание, что с DWARF версии 2 некоторые порты требуют и всегда используют некоторые неконфликтные расширения DWARF 3 в таблицах разворачивания.
Для максимальной пользы версия 4 может потребовать GDB 7.0 и -fvar-tracking-assignments. Версия 5 требует GDB 8.0 или выше.
GCC больше не поддерживает DWARF версии 1, которая существенно отличается от версии 2 и более поздних. По историческим причинам некоторые другие связанные с DWARF опции, такие как -fno-dwarf2-cfi-asm, сохраняют ссылку на DWARF версии 2 в своих именах, но применяются ко всем в настоящее время поддерживаемым версиям DWARF.
-gbtf-
Запрос отладочной информации BTF. BTF является форматом отладки по умолчанию для цели eBPF. На других целях, таких как x86, отладочная информация BTF может быть сгенерирована вместе с отладочной информацией DWARF, когда оба формата отладки включены явно через соответствующие параметры командной строки.
-gctf-gctflevel-
Запрос отладочной информации CTF и использование уровня для указания объёма генерируемой информации CTF. Если -gctf указан без значения для уровня, то уровень отладочной информации CTF по умолчанию равен 2.
Отладочная информация CTF может быть сгенерирована вместе с отладочной информацией DWARF, когда оба формата отладки включены явно через соответствующие параметры командной строки.
Уровень 0 не генерирует никакой отладочной информации CTF. Таким образом, -gctf0 отменяет -gctf.
Уровень 1 генерирует информацию CTF только для трассировок. Это включает информацию о точках вызова, но не включает информацию о типах.
Уровень 2 генерирует информацию о типах для сущностей (функций, данных и т. д.) только на уровне файла или глобальном уровне.
-gstabs-
Создавать отладочную информацию в формате stabs (если это поддерживается), без расширений GDB. Это формат, используемый DBX на большинстве систем BSD. На системах MIPS, Alpha и System V Release 4 этот параметр создаёт отладочный вывод stabs, который не понимается DBX. На системах System V Release 4 этот параметр требует GNU ассемблера.
-gstabs+-
Создавать отладочную информацию в формате stabs (если это поддерживается), используя расширения GNU, которые понимает только отладчик GNU (GDB). Использование этих расширений, вероятно, приведёт к сбою или отказу других отладчиков от чтения программы.
-gxcoff-
Создавать отладочную информацию в формате XCOFF (если это поддерживается). Это формат, используемый отладчиком DBX на системах IBM RS/6000.
-gxcoff+-
Создавать отладочную информацию в формате XCOFF (если это поддерживается), используя расширения GNU, которые понимает только отладчик GNU (GDB). Использование этих расширений, вероятно, приведёт к сбою или отказу других отладчиков от чтения программы, а также может привести к ошибкам в ассемблерах, отличных от GNU ассемблера (GAS).
-gvms-
Создавать отладочную информацию в формате отладки Alpha/VMS (если это поддерживается). Это формат, используемый отладчиком DEBUG на системах Alpha/VMS.
-glevel-ggdblevel-gstabslevel-gxcofflevel-gvmslevel-
Запрос отладочной информации, а также использование level для указания объёма информации. Уровень по умолчанию равен 2.
Уровень 0 не генерирует никакой отладочной информации. Таким образом, -g0 отменяет -g.
Уровень 1 генерирует минимальную информацию, достаточную для создания стековых следов в частях программы, которые вы не планируете отлаживать. Это включает описания функций и внешних переменных, и таблицы номеров строк, но не включает информацию о локальных переменных.
Уровень 3 включает дополнительную информацию, такую как все определения макросов, присутствующие в программе. Некоторые отладчики поддерживают расширение макросов при использовании -g3.
Если вы используете несколько опций -g с или без номеров уровня, последняя такая опция является эффективной.
-gdwarf не принимает конкатенированный уровень отладки, чтобы избежать путаницы с -gdwarf-level. Вместо этого используйте дополнительную опцию -glevel для изменения уровня отладки для DWARF.
-fno-eliminate-unused-debug-symbols-
По умолчанию не создаётся отладочная информация для символов, которые фактически не используются. Используйте эту опцию, если вы хотите отладочную информацию для всех символов.
-femit-class-debug-always-
Вместо генерации отладочной информации для класса C++ только в одном объектом файле, генерировать её во всех объектных файлах, использующих этот класс. Эту опцию следует использовать только с отладчиками, которые не могут обработать способ, которым GCC обычно генерирует отладочную информацию для классов, поскольку использование этой опции увеличивает размер отладочной информации примерно вдвое.
-fno-merge-debug-strings-
Указать линкеру не объединять идентичные строки в отладочной информации из разных объектных файлов. Объединение не поддерживается всеми ассемблерами или линтерами. Объединение уменьшает размер отладочной информации в выходном файле за счёт увеличения времени обработки линкирования. Объединение включено по умолчанию.
-fdebug-prefix-map=old=new-
При компиляции файлов, находящихся в каталоге old, записывать отладочную информацию, описывающую их так, как если бы файлы находились в каталоге new вместо этого. Это можно использовать для замены пути времени компиляции путём времени установки в отладочной информации. Это также может быть использовано для изменения абсолютного пути на относительный, используя . для new. Это может обеспечить более воспроизводимые сборки, которые не зависят от расположения, но могут потребовать дополнительной команды, чтобы сказать GDB, где найти исходные файлы. См. также -ffile-prefix-map.
-fvar-tracking-
Запуск прохода отслеживания переменных. Он вычисляет место хранения переменных в каждой позиции в коде. Затем генерируется лучшая отладочная информация (если формат отладочной информации поддерживает эту информацию).
Включается по умолчанию при компиляции с оптимизацией (-Os, -O, -O2, …), отладочной информацией (-g) и поддерживается форматом отладочной информации.
-fvar-tracking-assignments-
Ранняя аннотация присваиваний пользовательским переменным во время компиляции и попытка перенести аннотации в ходе компиляции до самого конца для улучшения отладочной информации при оптимизации. Рекомендуется использовать вместе с -gdwarf-4.
Может быть включён даже если отслеживание переменных отключено, в этом случае аннотации создаются и поддерживаются, но отбрасываются в конце. По умолчанию этот флаг включён вместе с -fvar-tracking, за исключением случаев включения селективного планирования.
-gsplit-dwarf-
Если включена отладочная информация DWARF, разделить как можно больше отладочной информации в отдельный выходной файл с расширением .dwo. Эта опция позволяет системе сборки избегать линковки файлов с отладочной информацией. Для использования требуется отладчик, способный читать файлы .dwo.
-gdwarf32-gdwarf64-
Если включена отладочная информация DWARF, -gdwarf32 выбирает 32-битный формат DWARF, а -gdwarf64 — 64-битный. По умолчанию это зависит от целевой платформы, на большинстве платформ используется -gdwarf32. 32-битный формат DWARF меньше, но не может поддерживать более 2 ГБ отладочной информации ни в одном из разделов отладочной информации DWARF. 64-битный формат DWARF позволяет использовать более объёмную отладочную информацию, но может быть не полностью поддержан всеми потребителями.
-gdescribe-dies-
Добавить атрибуты описания к некоторым DWARF DIE, у которых нет атрибута имени, например, искусственные переменные, внешние ссылки и DIE параметров места вызова.
-gpubnames-
Сгенерировать разделы DWARF
.debug_pubnamesи.debug_pubtypes. -ggnu-pubnames-
Сгенерировать разделы
.debug_pubnamesи.debug_pubtypesв формате, подходящем для преобразования в индекс GDB. Эта опция полезна только с линком, способным генерировать индекс версии 7 GDB. -fdebug-types-section-
При использовании DWARF версии 4 или выше, DIE типов могут быть помещены в свой собственный раздел
.debug_typesвместо того, чтобы быть частью раздела.debug_info. Более эффективно поместить их в отдельный раздел comdat, так как линковщик может удалить дубликаты. Но не все потребители DWARF пока поддерживают разделы.debug_types, и в некоторых объектах.debug_typesможет привести к увеличению, а не уменьшению, размера отладочной информации. -grecord-gcc-switches-gno-record-gcc-switches-
Этот переключатель добавляет используемые параметры командной строки для вызова компилятора, которые могут повлиять на генерацию кода, в атрибут DW_AT_producer в отладочной информации DWARF. Опции конкатенируются пробелами, отделяющими их друг от друга и от версии компилятора. Включено по умолчанию. Смотрите также -frecord-gcc-switches для другого способа сохранения параметров компилятора в объектный файл.
-gstrict-dwarf-
Запретить использование расширений более поздней версии стандарта DWARF, чем выбранная с помощью -gdwarf-version. На большинстве целей использование неконфликтных расширений DWARF из более поздних версий стандарта разрешено.
-gno-strict-dwarf
-
Разрешить использование расширений более поздней версии стандарта DWARF, чем та, которая выбрана с помощью -gdwarf-version.
-gas-loc-support-
Сообщить компилятору, что ассемблер поддерживает
.locдирективы. В этом случае он может использовать их для генерации ассемблером таблиц номеров строк DWARF2+.Это, как правило, желательно, так как таблицы номеров строк, сгенерированные ассемблером, значительно компактнее, чем те, которые компилятор может сгенерировать сам.
Этот параметр будет включён по умолчанию, если во время конфигурации GCC ассемблер был обнаружен с поддержкой таких директив.
-gno-as-loc-support-
Принудительно заставить GCC генерировать таблицы номеров строк DWARF2+ в случае, если они должны быть сгенерированы.
-gas-locview-support-
Сообщить компилятору, что ассемблер поддерживает
viewприсваивание и сброс проверок утверждений в.locдирективах.Этот параметр будет включен по умолчанию, если во время конфигурации GCC ассемблер был обнаружен с поддержкой этих директив.
-gno-as-locview-support-
Принудительно заставить GCC присваивать номера представлений в случае, если -gvariable-location-views явно запрошены.
-gcolumn-info-gno-column-info-
Выводить информацию о колонках расположения в отладочной информации DWARF, а не только файл и строку. Этот параметр включён по умолчанию.
-gstatement-frontiers-gno-statement-frontiers-
Этот параметр заставляет GCC создавать маркеры в внутренней представлении в начале операторов и примерно сохранять их во время компиляции, используя их для управления выводом
is_stmtмаркеров в таблице номеров строк. Он включен по умолчанию при компиляции с оптимизацией (-Os, -O1, -O2, …), и выводе отладочной информации DWARF 2 на обычном уровне. -gvariable-location-views-gvariable-location-views=incompat5-gno-variable-location-views-
Увеличить списки расположения переменных с прогрессивными номерами представлений, подразумеваемыми таблицей номеров строк. Это позволяет потребителям отладочной информации просматривать состояние в определённых точках программы, даже если инструкции, связанные с соответствующими расположениями исходного кода, отсутствуют в этой точке. Если ассемблер не поддерживает номера представлений в таблицах номеров строк, это заставит компилятор выводить таблицу номеров строк, что, как правило, делает её несколько менее компактной. Расширенные таблицы номеров строк и списки расположений полностью совместимы с предыдущими версиями, поэтому их могут использовать потребители отладочной информации, которые не знают об этих расширениях, но не получат от них никакой пользы.
Этот параметр включен по умолчанию при выводе отладочной информации DWARF 2 на нормальном уровне, при наличии поддержки ассемблером, включенном -fvar-tracking-assignments и выключенном -gstrict-dwarf. Если поддержка ассемблера отсутствует, этот параметр может быть всё ещё включён, но это заставит GCC вывести внутренние таблицы номеров строк, и если -ginternal-reset-location-views не включён, это почти наверняка приведёт к несоответствию представлений расположений без сообщения об ошибке.
Предлагается представление для номеров представлений, которое несовместимо с форматом списка расположений, введённым в DWARF 5, которое может быть включено с помощью -gvariable-location-views=incompat5. Этот параметр может быть удалён в будущем, предоставляется только как справочная реализация предлагаемого представления. От потребителей отладочной информации не ожидается поддержки этого расширенного формата, и они окажутся неспособными декодировать списки расположений, использующие его.
-ginternal-reset-location-views-gno-internal-reset-location-views-
Попытаться определить представления расположений, которые могут быть опущены из списков представлений расположений. Это требует от компилятора очень точных оценок длины инструкций, что не всегда выполняется, и это может привести к молчаливому созданию неправильных списков представлений при использовании ассемблера, не поддерживающего списки представлений расположений. Ассемблер GNU будет отмечать любую такую ошибку как
view number mismatch. Этот параметр включён только на портах, которые определяют надёжную функцию оценки. -ginline-points-gno-inline-points-
Генерировать расширенную отладочную информацию для вложенных функций. Маркеры отслеживания представлений расположений вставляются в точки входа вложенных функций, чтобы адреса и номера представлений могли быть вычислены и выведены в отладочной информации. Это может быть включено независимо от представлений расположений, в этом случае номера представлений не будут выведены, но оно может быть включено только вместе с началом операторов, и по умолчанию оно включено только в том случае, если включены представления расположений.
-gz[=type]-
Создавать сжатые отладочные секции в формате DWARF, если это поддерживается. Если type не указан, тип по умолчанию зависит от возможностей используемого ассемблера и линковщика. type может быть одним из ‘none’ (не сжимать отладочные секции), ‘zlib’ (использовать сжатие zlib в формате ELF gABI) или ‘zlib-gnu’ (использовать сжатие zlib в традиционном формате GNU). Если линковщик не поддерживает запись сжатых отладочных секций, параметр отклоняется. В противном случае, если ассемблер не поддерживает их, -gz молча игнорируется при создании объектных файлов.
-femit-struct-debug-baseonly-
Выводить отладочную информацию для типов, похожих на структуры, только когда базовое имя файла исходного кода компиляции соответствует базовому имени файла, в котором структура определена.
Этот параметр существенно уменьшает размер отладочной информации, но при этом существенно потенциально теряется информация о типах для отладчика. Смотрите -femit-struct-debug-reduced для менее агрессивного параметра. Смотрите -femit-struct-debug-detailed для более подробного управления.
Этот параметр работает только с отладочным выводом DWARF.
-femit-struct-debug-reduced-
Выводить отладочную информацию для типов, похожих на структуры, только когда базовое имя файла исходного кода компиляции соответствует базовому имени файла, в котором тип определён, если структура не является шаблоном или не определена в системном заголовочном файле.
Этот параметр значительно уменьшает размер отладочной информации, с некоторой потенциальной потерей информации о типах для отладчика. Смотрите -femit-struct-debug-baseonly для более агрессивного параметра. Смотрите -femit-struct-debug-detailed для более подробного управления.
Этот параметр работает только с отладочным выводом DWARF.
-femit-struct-debug-detailed[=spec-list]-
Указать типы, похожие на структуры, для которых компилятор генерирует отладочную информацию. Цель состоит в том, чтобы уменьшить дублирование отладочной информации о структурах между различными объектами в той же программе.
Этот параметр — подробная версия -femit-struct-debug-reduced и -femit-struct-debug-baseonly, которая подходит для большинства случаев.
Спецификация имеет синтаксис [‘dir:’|‘ind:’][‘ord:’|‘gen:’](‘any’|‘sys’|‘base’|‘none’)
Необязательное первое слово ограничивает спецификацию структурами, которые используются напрямую (‘dir:’) или косвенно (‘ind:’). Структура используется напрямую, когда она является типом переменной или члена. Косвенное использование возникает через указатели на структуры. То есть, когда использование неполной структуры допустимо, использование является косвенным. Пример: ‘struct one direct; struct two * indirect;’.
Необязательное второе слово ограничивает спецификацию обычными структурами (‘ord:’) или обобщёнными структурами (‘gen:’). Обобщённые структуры немного сложнее объяснить. Для C++ это неявные специализации шаблонов классов или классы без шаблонов в вышеупомянутом контексте. Другие языки программирования также имеют обобщения, но -femit-struct-debug-detailed ещё не реализовал их.
Третье слово указывает файлы исходного кода для тех структур, для которых компилятор должен выводить отладочную информацию. Значения ‘none’ и ‘any’ имеют обычное значение. Значение ‘base’ означает, что основа имени файла, в котором появляется объявление типа, должна соответствовать основе имени основного файла компиляции. На практике это означает, что при компиляции foo.c отладочная информация генерируется для типов, объявленных в этом файле и foo.h, но не для других заголовочных файлов. Значение ‘sys’ означает те типы, которые удовлетворяют ‘base’ или объявлены в системных или компиляторных заголовочных файлах.
Вам может потребоваться экспериментировать, чтобы определить лучшие настройки для вашего приложения.
По умолчанию -femit-struct-debug-detailed=all.
Этот параметр работает только с отладочным выводом DWARF.
-fno-dwarf2-cfi-asm-
Выводить отладочную информацию DWARF для разворачивания как сгенерированные компилятором
.eh_frameсекции вместо использования.cfi_*директив ассемблера GAS. -fno-eliminate-unused-debug-types-
Обычно, при выводе DWARF, GCC избегает вывода символов отладки для типов, которые нигде не используются в файле исходного кода, который компилируется. Иногда бывает полезно, чтобы GCC выводил отладочную информацию для всех типов, объявленных в единице компиляции, независимо от того, используются ли они в этой единице компиляции или нет, например, если в отладчике вы хотите привести значение к типу, который фактически не используется в вашей программе (но объявлен). Однако чаще всего это приводит к значительному количеству пустых ресурсов.
Далее: Параметры оптимизации, Предыдущее: Параметры статического анализатора, Наверх: Вызов GCC [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Debugging-Options.html