Sun Studio 12: Debugging a Program With dbx

Setting Data Change Breakpoints

You can use data change breakpoints in dbx to note when the value of a variable or expression has changed.

Stopping Execution When an Address Is Accessed

To stop execution when a memory address has been accessed, type:


(dbx) stop access mode address-expression [, byte-size-expression]

mode specifies how the memory was accessed. It can be composed of one or all of the letters:

r

The memory at the specified address has been read.

w

The memory has been written to.

x

The memory has been executed.

mode can also contain either of the following:

a

Stops the process after the access (default).

b

Stops the process before the access.

In both cases the program counter will point at the offending instruction. The “before” and “after” refer to the side effect.

address-expression is any expression that can be evaluated to produce an address. If you give a symbolic expression, the size of the region to be watched is automatically deduced; you can override it by specifying byte-size-expression. You can also use nonsymbolic, typeless address expressions; in which case, the size is mandatory.

In the following example, execution will stop execution after the memory address 0x4762 has been read


(dbx) stop access r 0x4762
:

In this example, execution will stop before the variable speed has be written to:


(dbx) stop access wb &speed

Keep these points in mind when using the stop access command:

For more information on specifying an access event, see access mode address-expression [, byte-size-expression] and stop Command.

Stopping Execution When Variables Change

To stop program execution if the value of a specified variable has changed, type:


(dbx) stop change variable

Keep these points in mind when using the stop change command:

For more information on specifying a change event, see change variable and stop Command.

dbx implements stop change by causing automatic single stepping together with a check on the value at each step. Stepping skips over library calls if the library was not compiled with the -g option. So, if control flows in the following manner, dbx does not trace the nested user_routine2 because tracing skips the library call and the nested call to user_routine2.


   user_routine calls
      library_routine, which calls
        user_routine2, which changes variable

The change in the value of variable appears to have occurred after the return from the library call, not in the middle of user_routine2.

dbx cannot set a breakpoint for a change in a block local variable—a variable nested in {}. If you try to set a breakpoint or trace in a block local “nested” variable, dbx issues an error informing you that it cannot perform this operation.


Note –

It is faster to watch data changes using the access event than the change event. Instead of automatically single-stepping the program, the access event uses a page protection scheme that is much faster.


Stopping Execution on a Condition

To stop program execution if a conditional statement evaluates to true, type:


(dbx) stop cond condition

The program stops executing when the condition occurs.

Keep these points in mind when using the stop cond command:

For more information on specifying a condition event, see cond condition-expression and stop Command.