3.10 Параметры отладки вашей программы
Для того, чтобы GCC генерировал дополнительную информацию, полезную для отладчика, в подавляющем большинстве случаев достаточно добавить -g к вашим другим параметрам. Некоторые форматы отладки могут сосуществовать (например, DWARF и CTF), если каждый из них явно включен путём добавления соответствующего параметра командной строки к другим вашим параметрам.
GCC позволяет использовать -g с -O. Сокращения, применяемые оптимизированным кодом, иногда могут быть неожиданными: некоторые объявленные вами переменные могут вообще отсутствовать; поток управления может временно переместиться в непредсказуемые места; некоторые инструкции могут не выполняться, так как вычисляют константные результаты или их значения уже известны; некоторые инструкции могут выполняться в других местах, поскольку они были перемещены из циклов. Тем не менее, отладка оптимизированного вывода возможна. Это делает разумным использование оптимизатора для программ, которые могут содержать ошибки.
Если вы не используете другие параметры оптимизации, рассмотрите возможность использования -Og (см. Параметры управления оптимизацией) вместе с -g. Без параметра -O вообще некоторые этапы компиляции, которые собирают информацию, полезную для отладки, не выполняются, поэтому -Og может привести к более эффективному процессу отладки.
-
-g -
Выводить отладочную информацию в формате операционной системы (stabs, COFF, XCOFF или DWARF). GDB может работать с этой информацией.
На большинстве систем, использующих формат stabs, -g активирует использование дополнительной отладочной информации, которую может использовать только GDB; эта дополнительная информация улучшает отладку в GDB, но, вероятно, вызовет сбой или отказ других отладчиков при чтении программы. Если вы хотите точно контролировать генерацию дополнительной информации, используйте -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 генерирует информацию о типах для сущностей (функций, объектов данных и т. д.) только на уровне файла или глобальном уровне.
-
-gvms -
Выводить отладочную информацию в формате отладки Alpha/VMS (если он поддерживается). Это формат, используемый DEBUG на системах Alpha/VMS.
-glevel-ggdblevel-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 и -fcanon-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. Эта опция полезна только с линковщиком, который может создавать индекс GDB версии 7. -
-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+ внутри, если должны быть сгенерированы таблицы номеров строк 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). Если компоновщик не поддерживает запись сжатых секций отладки, параметр отклоняется. В противном случае, если ассемблер не поддерживает их, -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, вместо использования директив GAS.cfi_*. -
-fno-eliminate-unused-debug-types Обычно, при создании вывода DWARF, GCC избегает создания символов отладки для типов, которые нигде не используются в файле исходного кода, который компилируется. Иногда полезно, чтобы GCC выводил отладочную информацию для всех типов, объявленных в единице компиляции, независимо от того, используются ли они в этой единице компиляции или нет, например, если в отладчике вы хотите привести значение к типу, который фактически не используется в вашей программе (но объявлен). Однако чаще всего это приводит к значительному количеству ненужного места.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/Debugging-Options.html