Prism 6.0 User's Guide

Combining Debug and Optimization Options

If you use Prism on programs that have been compiled with optimization options, you should expect different behavior from Prism commands and changes in the visibility of variables in the optimized programs.

Interpreting Prism Interaction With an Optimized Program

When the control flow is inside a routine that has been compiled with both -g and an optimization option (a debuggable optimized routine), the next and step commands change their behavior:

You can set breakpoints using the stop at command inside debuggable optimized routines only at the first line of such a routine. If the routine name is foo and the first instruction in foo is ADDR_INSTR then the breakpoint is set as if you had used stop in foo or stopi at ADDR_INSTR.

Note that the following (related) commands are unaffected:

When the control flow returns to a debuggable optimized routine, as a result of one of the following commands:

then Prism assumes that the current position is at the first line of the current routine. Prism makes the same assumption when the source file position (at the command line or in the GUI) is updated as a result of up or down commands ending in a debuggable optimized routine.

Accessing Variables in Optimized Routines

Due to the effects of optimization on variable location in executable programs that have been compiled with optimization, not all variables can be accessed by Prism at all times.

The accessibility of variables can be defined by whether the variables can be used in expressions that require the right value of the variable (such as print X, or call foo(X)) or the left value of the variable (such as assign X=1).

The limits of accessibility can be described by the flow of control in an optimized program. When the flow of control is in a routine compiled with both -g and an optimization flag:

The following commands can use only accessible variables:

The where command reports all active stack frames which have a stack pointer. The where command does not report routines that have no frame pointer and routines that have been inlined.