Debugging and Optimizations

This topic describes the relationship between various command-line options that  control debugging and optimizing.

Whenever you enable debugging with -g(Linux* OS and Mac OS* X) or /debug:full(Windows* OS), you disable optimizations. You can override this behavior by explicitly specifying compiler options for optimizations on the command line.

The following summarizes commonly used options for debugging and for optimization.

-O0 (Linux OS and Mac OS X) or /Od (Windows* OS)

Disables optimizations so you can debug your program before any optimization is attempted.  This is the default behavior when debugging.

On Linux OS and Mac OS X,
-fno-omit-frame-pointer is set if option -O0 (or -g) is specified.

For more information, see the following topic:

  • -O0 (Linux OS and Mac OS X) or /Od (Windows OS) compiler option

-O1 or /O1
-O2 or /O2 -O3 or /O3

Specifies the code optimization level for applications. If you use any of these options, it is recommended that you use -debug extendedwhen debugging.

For more information, see the following topic:

  • -O1, -O2, -O3 (Linux OS and Mac OS X) or /O (Windows OS) compiler option

-g or /debug:full

Generates symbolic debugging information and line numbers in the object code for use by the source-level debuggers. Turns off -O2 (Linux OS and Mac OS X) or /O2 (Windows) and makes -O0 (Linux OS and Mac OS X) or /Od (Windows OS) the default. The exception to this is if  -O2, -O1 or -O3 (Linux OS and Mac OS X) or /O2, /O1 or /O3 (Windows OS) is explicitly specified in the command line.

For more information, see the following topic:

  • -g (Linux OS and Mac OS X) or /debug:full (Windows OS) compiler option

-debug extended (Linux OS and Mac OS X)

Specifies settings that enhance debugging.

For more information, see the following topic:

  • -debug extended  (Linux OS and Mac OS X)

-fp or /Oy-
(IA-32 architecture only)

Disables the ebp register in optimizations and sets the ebp register to be used as the frame pointer.

For more information, see the following topic:

  • -fp (Linux OS and Mac OS X) or /Oy (Windows OS) compiler option

-traceback (Linux OS and Mac OS X) or /traceback (Windows OS)

Causes the compiler to generate extra information in the object file, which allows a symbolic stack traceback.

For more information, see the following topic:

  • -traceback compiler option

Combining Optimization and Debugging

The compiler lets you generate code to support symbolic debugging when one of the O1, O2, or O3 optimization options is specified on the command line along with -g (Linux OS and Mac OS X) or /debug:full (Windows OS); this produces symbolic debug information in the object file.

Note that if you specify an O1, O2, or O3 option with the -g or /debug:full option, some of the debugging information returned may be inaccurate as a side-effect of optimization. To counter this on Linux OS and Mac OS X, you should also specify the -debug extended  option.

It is best to make your optimization and/or debugging choices explicit:

Note

When no optimization level is specified, the -g or /debug:full option slows program execution; this is because this option turns on -O0 or /Od, which causes the slowdown. However, if, for example, both -O2 (Linux OS and Mac OS X) or /O2 (Windows OS) and -g (Linux OS and Mac OS X) or /debug:full (Windows OS) are specified, the code should not experience much of a slowdown.

Refer to the table below for the summary of the effects of using the -g or /debug:full option with the optimization options.

These options Produce these results

-g (Linux OS and Mac OS X) or /debug:full (Windows OS)

Debugging information produced, -O0 or /Od enabled (meaning optimizations are disabled). For Linux OS and Mac OS X, -fp is also enabled for compilations targeted for IA-32 architecture.

-g -O1 (Linux OS and Mac OS X) or /debug:full /O1 (Windows*)

Debugging information produced, O1 optimizations enabled.

-g -O2 (Linux OS and Mac OS X) or
/debug:full /O2
(Windows OS)

Debugging information produced, O2 optimizations enabled.

-g -O2 (Linux OS and Mac OS X) or
/debug:full /O2 /Oy-
(Windows OS)

Debugging information produced, O2 optimizations enabled; for Windows OS using IA-32 architecture, /Oy disabled.

-g -O3 -fp (Linux OS and Mac OS X) or /debug:full /O3 (Windows OS)

Debugging information produced, O3 optimizations enabled; for Linux OS, -fp enabled for compilations targeted for IA-32 architecture.

Note

Even the use of debug extendedwith optimized programs may not allow you  to examine all variables or to set breaks at all lines, due to code movement or removal during the optimization process