3.10 Параметры для отладки вашей программы ¶
Для того, чтобы GCC генерировал дополнительную информацию, используемую отладчиком, почти во всех случаях достаточно добавить -g к другим параметрам.
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; по умолчанию для большинства целей используется версия 4. Версия DWARF 5 является экспериментальной.
Обратите внимание, что с DWARF версии 2 некоторые порты требуют и всегда используют некоторые неконфликтные расширения DWARF 3 в таблицах разматывания.
Для максимальной эффективности версия 4 может потребовать GDB 7.0 и -fvar-tracking-assignments.
GCC больше не поддерживает DWARF версии 1, которая существенно отличается от версии 2 и более поздних. По историческим причинам некоторые другие связанные с DWARF параметры, такие как -fno-dwarf2-cfi-asm, сохраняют ссылку на DWARF версии 2 в своих именах, но применяются ко всем в настоящее время поддерживаемым версиям DWARF.
-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.
-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, -O, -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раздел вместо использования директив 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-10.5.0/gcc/Debugging-Options.html