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. Версия 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.
-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 вместо этого. Это можно использовать для замены пути времени компиляции на путь времени установки в отладочной информации. Это также можно использовать для изменения абсолютного пути на относительный путь, используя . для new. Это может дать более воспроизводимые сборки, которые независимы от местоположения, но могут потребовать дополнительной команды для указания GDB местонахождения исходных файлов. См. также -ffile-prefix-map.
-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. Эффективнее поместить их в отдельные секции 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+ внутри, если они должны быть сгенерированы.
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 выводил отладочную информацию для всех типов, объявленных в единице компиляции, независимо от того, используются ли они в этой единице компиляции или нет, например, если в отладчике вы хотите привести значение к типу, который фактически не используется в вашей программе (но объявлен). Однако чаще это приводит к значительному количеству ненужного места.
Далее: Параметры оптимизации, Предыдущее: Параметры предупреждений, Вверх: Вызов GCC [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/Debugging-Options.html