Spec-Zone.ru › GCC 15

3.11 Параметры отладки программы

Чтобы указать 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 / macOS, где по умолчанию используется версия 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, если оба формата отладки явно включены соответствующими параметрами командной строки.

-gprune-btf
-gno-prune-btf

Отбрасывать ненужную информацию BTF перед выводом. При таком сокращении выводится только информация о типах, используемых глобальными переменными и функциями с областью видимости файла. При компиляции для целевой платформы BPF с включённым BPF CO-RE информация о типах также выводится для типов, используемых в перемещениях BPF CO-RE. Кроме того, типы struct и union, на которые ссылаются только указатели из членов других типов struct или union, отбрасываются и заменяются на BTF_KIND_FWD, как если бы эти типы присутствовали во входных данных только в виде предварительных объявлений.

Этот параметр существенно уменьшает размер создаваемой информации BTF, но при этом значительно сокращает объём подробной информации о типах. Он главным образом полезен при компиляции для целевой платформы BPF, чтобы минимизировать размер итогового объектного файла и удалить информацию BTF, не имеющую непосредственного отношения к процессу загрузки программы BPF.

При создании информации BTF для целевой платформы BPF этот параметр включён по умолчанию.

-gctf
-gctflevel

Запрашивать отладочную информацию CTF; значение level задаёт её объём. Если параметр -gctf указан без значения level, по умолчанию используется уровень отладочной информации CTF 2.

Отладочную информацию CTF можно создавать вместе с отладочной информацией DWARF, если оба формата отладки явно включены соответствующими параметрами командной строки.

Уровень 0 не создаёт отладочную информацию CTF. Таким образом, -gctf0 отменяет действие -gctf.

Уровень 1 создаёт информацию CTF только для трассировок стека. Она включает информацию о местах вызова, но не содержит информацию о типах.

Уровень 2 создаёт информацию о типах сущностей (функций, объектов данных и т. д.) только с областью видимости файла или глобальной областью видимости.

-gvms

Создавать отладочную информацию в формате отладки Alpha/VMS (если он поддерживается). Этот формат используется DEBUG в системах Alpha/VMS.

-gcodeview

Создавать отладочную информацию в формате отладки CodeView (если он поддерживается). Этот формат используется Microsoft Visual C++ в Windows.

-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 GiB отладочной информации в любом из разделов отладочной информации DWARF. 64-разрядный формат DWARF допускает больший объём отладочной информации, однако пока может поддерживаться не всеми средствами обработки.

-gdescribe-dies

Добавлять атрибуты описания к некоторым DIE DWARF, не имеющим атрибута имени, например к искусственным переменным, внешним ссылкам и 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+, если такие таблицы должны быть созданы.

-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

Выводить отладочную информацию для типов, подобных struct, только если базовое имя исходного файла компиляции совпадает с базовым именем файла, в котором определён тип struct.

Этот параметр существенно уменьшает объём отладочной информации, но может значительно сократить объём информации о типах, доступной отладчику. Менее агрессивный вариант см. в описании -femit-struct-debug-reduced. Для более точной настройки см. -femit-struct-debug-detailed.

Этот параметр работает только при выводе отладочной информации DWARF.

-femit-struct-debug-reduced

Выводить отладочную информацию для типов, подобных struct, только если базовое имя исходного файла компиляции совпадает с базовым именем файла, в котором определён тип, за исключением случаев, когда struct является шаблоном или определён в системном заголовочном файле.

Этот параметр значительно уменьшает объём отладочной информации, но может несколько сократить объём информации о типах, доступной отладчику. Более агрессивный вариант см. в описании -femit-struct-debug-baseonly. Для более точной настройки см. -femit-struct-debug-detailed.

Этот параметр работает только при выводе отладочной информации DWARF.

-femit-struct-debug-detailed[=spec-list]

Указывать типы, подобные struct, для которых компилятор создаёт отладочную информацию. Цель этого параметра — уменьшить дублирование отладочной информации для структур между разными объектными файлами одной программы.

Этот параметр представляет собой подробный вариант -femit-struct-debug-reduced и -femit-struct-debug-baseonly, которых достаточно для большинства задач.

Спецификация имеет синтаксис [‘dir:’|‘ind:’][‘ord:’|‘gen:’](‘any’|‘sys’|‘base’|‘none’)

Первое необязательное слово ограничивает спецификацию структурами, используемыми напрямую (‘dir:’), или косвенно (‘ind:’). Тип struct используется напрямую, когда он является типом переменной или члена. Косвенное использование происходит через указатели на структуры. Иными словами, если допустимо использование неполного типа struct, то это косвенное использование. Например: ‘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-15.3.0/gcc/Debugging-Options.html

Spec-Zone.ru

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