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 / macOS, где по умолчанию используется версия 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.
-gcodeview-
Выводит отладочную информацию в формате CodeView (если он поддерживается). Это формат, используемый Microsoft Visual C++ на Windows.
-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 -
Добавляет атрибуты описания к некоторым DIE DWARF, у которых нет атрибута имени, например, искусственные переменные, внешние ссылки и 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. Это более эффективно, поскольку компоновщик может удалить дубликаты. Однако не все потребители 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 -
Сообщает компилятору, что ассемблер поддерживает проверку утверждений присваивания и сброса в директивах
.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-14.2.0/gcc/Debugging-Options.html