Spec-Zone.ru › GCC 13

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API