To tell GCC to emit extra information for use by a debugger, in almost all cases you need only to add -g
to your other options.
GCC allows you to use -g
with -O
. The shortcuts taken by optimized code may occasionally be surprising: some variables you declared may not exist at all; flow of control may briefly move where you did not expect it; some statements may not be executed because they compute constant results or their values are already at hand; some statements may execute in different places because they have been moved out of loops. Nevertheless it is possible to debug optimized output. This makes it reasonable to use the optimizer for programs that might have bugs.
If you are not using some other optimization option, consider using -Og
(see Optimize Options) with -g
. With no -O
option at all, some compiler passes that collect information useful for debugging do not run at all, so that -Og
may result in a better debugging experience.
-g
On most systems that use stabs format, -g
enables use of extra debugging information that only GDB can use; this extra information makes debugging work better in GDB but probably makes other debuggers crash or refuse to read the program. If you want to control for certain whether to generate the extra information, use -gstabs+
, -gstabs
, -gxcoff+
, -gxcoff
, or -gvms
(see below).
-ggdb
-gdwarf
-gdwarf-
version
Note that with DWARF Version 2, some ports require and always use some non-conflicting DWARF 3 extensions in the unwind tables.
Version 4 may require GDB 7.0 and -fvar-tracking-assignments
for maximum benefit.
GCC no longer supports DWARF Version 1, which is substantially different than Version 2 and later. For historical reasons, some other DWARF-related options (including -feliminate-dwarf2-dups
and -fno-dwarf2-cfi-asm
) retain a reference to DWARF Version 2 in their names, but apply to all currently-supported versions of DWARF.
-gstabs
-gstabs+
-gcoff
-gxcoff
-gxcoff+
-gvms
-g
level-ggdb
level-gstabs
level-gcoff
level-gxcoff
level-gvms
level
Level 0 produces no debug information at all. Thus, -g0
negates -g
.
Level 1 produces minimal information, enough for making backtraces in parts of the program that you don't plan to debug. This includes descriptions of functions and external variables, and line number tables, but no information about local variables.
Level 3 includes extra information, such as all the macro definitions present in the program. Some debuggers support macro expansion when you use -g3
.
-gdwarf
does not accept a concatenated debug level, to avoid confusion with -gdwarf-level. Instead use an additional -glevel option to change the debug level for DWARF.
-feliminate-unused-debug-symbols
-femit-class-debug-always
-fno-merge-debug-strings
-fdebug-prefix-map=
old=
new
-fvar-tracking
It is enabled by default when compiling with optimization (-Os
, -O
, -O2
, ...), debugging information (-g
) and the debug info format supports it.
-fvar-tracking-assignments
-gdwarf-4
is recommended along with it. It can be enabled even if var-tracking is disabled, in which case annotations are created and maintained, but discarded at the end. By default, this flag is enabled together with -fvar-tracking
, except when selective scheduling is enabled.
-gsplit-dwarf
.dwo
. This option allows the build system to avoid linking files with debug information. To be useful, this option requires a debugger capable of reading .dwo
files. -gpubnames
.debug_pubnames
and .debug_pubtypes
sections. -ggnu-pubnames
.debug_pubnames
and .debug_pubtypes
sections in a format suitable for conversion into a GDB index. This option is only useful with a linker that can produce GDB index version 7. -fdebug-types-section
.debug_types
section instead of making them part of the .debug_info
section. It is more efficient to put them in a separate comdat sections since the linker can then remove duplicates. But not all DWARF consumers support .debug_types
sections yet and on some objects .debug_types
produces larger instead of smaller debugging information. -grecord-gcc-switches
-gno-record-gcc-switches
-frecord-gcc-switches
for another way of storing compiler options into the object file. -gstrict-dwarf
-gno-strict-dwarf
-gz
[=
type]
none
’ (don't compress debug sections), ‘zlib
’ (use zlib compression in ELF gABI format), or ‘zlib-gnu
’ (use zlib compression in traditional GNU format). If the linker doesn't support writing compressed debug sections, the option is rejected. Otherwise, if the assembler does not support them, -gz
is silently ignored when producing object files. -feliminate-dwarf2-dups
-femit-struct-debug-baseonly
This option substantially reduces the size of debugging information, but at significant potential loss in type information to the debugger. See -femit-struct-debug-reduced
for a less aggressive option. See -femit-struct-debug-detailed
for more detailed control.
This option works only with DWARF debug output.
-femit-struct-debug-reduced
This option significantly reduces the size of debugging information, with some potential loss in type information to the debugger. See -femit-struct-debug-baseonly
for a more aggressive option. See -femit-struct-debug-detailed
for more detailed control.
This option works only with DWARF debug output.
-femit-struct-debug-detailed
[=
spec-list]
This option is a detailed version of -femit-struct-debug-reduced
and -femit-struct-debug-baseonly
, which serves for most needs.
A specification has the syntax [‘dir:
’|‘ind:
’][‘ord:
’|‘gen:
’](‘any
’|‘sys
’|‘base
’|‘none
’)
The optional first word limits the specification to structs that are used directly (‘dir:
’) or used indirectly (‘ind:
’). A struct type is used directly when it is the type of a variable, member. Indirect uses arise through pointers to structs. That is, when use of an incomplete struct is valid, the use is indirect. An example is ‘struct one direct; struct two * indirect;
’.
The optional second word limits the specification to ordinary structs (‘ord:
’) or generic structs (‘gen:
’). Generic structs are a bit complicated to explain. For C++, these are non-explicit specializations of template classes, or non-template classes within the above. Other programming languages have generics, but -femit-struct-debug-detailed
does not yet implement them.
The third word specifies the source files for those structs for which the compiler should emit debug information. The values ‘none
’ and ‘any
’ have the normal meaning. The value ‘base
’ means that the base of name of the file in which the type declaration appears must match the base of the name of the main compilation file. In practice, this means that when compiling foo.c
, debug information is generated for types declared in that file and foo.h
, but not other header files. The value ‘sys
’ means those types satisfying ‘base
’ or declared in system or compiler headers.
You may need to experiment to determine the best settings for your application.
The default is -femit-struct-debug-detailed=all
.
This option works only with DWARF debug output.
-fno-dwarf2-cfi-asm
.eh_frame
section instead of using GAS .cfi_*
directives. -fno-eliminate-unused-debug-types
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.3.0/gcc/Debugging-Options.html