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; по умолчанию для большинства целей используется версия 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.
-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. Этот параметр полезен только с линком, который может создавать индекс 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-
Принудительно сгенерировать таблицы номеров строк DWARF2+ внутри 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, -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-11.4.0/gcc/Debugging-Options.html