3.9 Варианты отладки вашей программы
Чтобы сообщить 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. Версия 5 DWARF находится только в стадии эксперимента.
Обратите внимание, что с DWARF версии 2 некоторые порты требуют и всегда используют некоторые неконфликтные расширения DWARF 3 в таблицах unwinding.
Версия 4 может потребовать GDB 7.0 и -fvar-tracking-assignments для максимальной пользы.
GCC больше не поддерживает DWARF версии 1, которая существенно отличается от версии 2 и более поздних. По историческим причинам некоторые другие параметры, связанные с DWARF (включая -feliminate-dwarf2-dups и -fno-dwarf2-cfi-asm), сохраняют ссылку на DWARF версии 2 в своих именах, но применяются ко всем текущим поддерживаемым версиям DWARF.
-gstabs-
Создать отладочную информацию в формате stabs (если он поддерживается), без расширений GDB. Это формат, используемый DBX на большинстве систем BSD. На системах MIPS, Alpha и System V Release 4 этот параметр производит отладочный вывод stabs, который не понимает DBX или SDB. На системах System V Release 4 этот параметр требует GNU ассемблера.
-gstabs+-
Создать отладочную информацию в формате stabs (если он поддерживается), используя расширения GNU, понятные только отладчику GNU (GDB). Использование этих расширений, вероятно, приведет к падению других отладчиков или отказу от чтения программы.
-gcoff-
Создать отладочную информацию в формате COFF (если он поддерживается). Это формат, используемый SDB на большинстве систем System V до System V Release 4.
-gxcoff-
Создать отладочную информацию в формате XCOFF (если он поддерживается). Это формат, используемый отладчиком DBX на системах IBM RS/6000.
-gxcoff+-
Создать отладочную информацию в формате XCOFF (если он поддерживается), используя расширения GNU, понятные только отладчику GNU (GDB). Использование этих расширений, вероятно, приведет к падению других отладчиков или отказу от чтения программы, а также может привести к ошибке ассемблеров, отличных от GNU ассемблера (GAS).
-gvms-
Создать отладочную информацию в формате отладки Alpha/VMS (если он поддерживается). Это формат, используемый DEBUG на системах Alpha/VMS.
-glevel-ggdblevel-gstabslevel-gcofflevel-gxcofflevel-gvmslevel-
Запрос отладочной информации и использование level для указания объёма информации. Уровень по умолчанию — 2.
Уровень 0 не производит никакой отладочной информации. Таким образом, -g0 отменяет -g.
Уровень 1 производит минимальную информацию, достаточную для создания стековых следов в частях программы, которые вы не планируете отлаживать. Включает описания функций и внешних переменных, таблицы номеров строк, но не содержит информации о локальных переменных.
Уровень 3 включает дополнительную информацию, такую как все макроопределения, присутствующие в программе. Некоторые отладчики поддерживают развёртывание макросов при использовании -g3.
-gdwarf не принимает уровень отладки через конкатенацию, чтобы избежать путаницы с -gdwarf-level. Вместо этого используйте дополнительный параметр -glevel для изменения уровня отладки DWARF.
-feliminate-unused-debug-symbols-
Создать отладочную информацию в формате stabs (если он поддерживается) только для символов, которые фактически используются.
-femit-class-debug-always-
Вместо вывода отладочной информации для C++ класса только в одном объектном файле, выводить её во всех объектных файлах, использующих этот класс. Этот параметр следует использовать только с отладчиками, которые не могут обрабатывать способ, которым GCC обычно генерирует отладочную информацию для классов, так как использование этого параметра увеличивает размер отладочной информации в два раза.
-fno-merge-debug-strings-
Указать линковщику не объединять идентичные строки в отладочной информации из различных объектных файлов. Объединение не поддерживается всеми ассемблерами или линковщиками. Объединение уменьшает размер отладочной информации в выходном файле, но увеличивает время обработки линковки. Объединение включено по умолчанию.
-fdebug-prefix-map=old=new-
При компиляции файлов в каталоге old записывать отладочную информацию, описывая их как в new.
-fvar-tracking-
Выполнить проход отслеживания переменных. Вычисляется, где хранятся переменные в каждой точке кода. Затем генерируется лучшая отладочная информация (если формат отладочной информации это поддерживает).
Включается по умолчанию при компиляции с оптимизацией (-Os, -O, -O2, …), отладочной информацией (-g) и формат отладочной информации это поддерживает.
-fvar-tracking-assignments-
Анотировать присваивания переменным пользователя на ранней стадии компиляции и пытаться перенести аннотации на протяжении всей компиляции до конца, с целью улучшения отладочной информации при оптимизации. Рекомендуется использовать -gdwarf-4 вместе с ним.
Может быть включено даже если отслеживание переменных отключено, в этом случае аннотации создаются и сохраняются, но удаляются в конце. По умолчанию этот флаг включен вместе с -fvar-tracking, за исключением случаев, когда включено выборочное планирование.
-gsplit-dwarf-
Разделить как можно больше отладочной информации DWARF в отдельный выходной файл с расширением .dwo. Этот параметр позволяет системе сборки избежать линковки файлов с отладочной информацией. Для эффективного использования требуется отладчик, способный читать файлы .dwo.
-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.
-gz[=type]-
Создать сжатые секции отладки в формате DWARF, если это поддерживается. Если type не задан, тип по умолчанию зависит от возможностей используемого ассемблера и линковщика. type может быть одним из: ‘none’ (не сжимать секции отладки), ‘zlib’ (использовать сжатие zlib в формате ELF gABI) или ‘zlib-gnu’ (использовать сжатие zlib в традиционном формате GNU). Если линковщик не поддерживает запись сжатых секций отладки, опция отклоняется. В противном случае, если ассемблер их не поддерживает, -gz молча игнорируется при создании объектных файлов.
-feliminate-dwarf2-dups-
Сжать отладочную информацию DWARF, удалив дублированную информацию о каждом символе. Этот параметр имеет смысл только при генерации отладочной информации DWARF.
-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 генерировал отладочную информацию для всех типов, объявленных в единице компиляции, независимо от того, используются ли они фактически в этой единице компиляции, например, если в отладчике вы хотите привести значение к типу, который фактически не используется в вашей программе (но объявлен). Однако чаще это приводит к значительному количеству ненужного места.
Далее: Параметры оптимизации, Предыдущее: Параметры предупреждений, Вверх: Вызов GCC [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Debugging-Options.html