The debugger can set breakpoints by evaluating simple C-like expressions. Note that the exact capabilities offered by the hardware to assist in data breakpointing will vary from target to target; please refer to the particular target interface you are using and the capabilities of your target silicon for exact details. The simplest expression supported is a symbol name. If the symbol name is a function, a breakpoint occurs when the first instruction of the symbol is about to be executed. If the symbol name is a variable, a breakpoint occurs when the symbol has been accessed; this is termed a data breakpoint. For example, the expression x will breakpoint when x is accessed. You can use a debug expression (see Debug expressions) as a breakpoint expression. For example, x[4] will breakpoint when element 4 of array x is accessed, and @sp will breakpoint when the sp register is accessed.

Data breakpoints can be specified, using the == operator, to occur when a symbol is accessed with a specific value. The expression x == 4 will breakpoint when x is accessed and its value is 4. The operators <, >=, >;, >=, ==, and != can be used similarly. For example, @sp <= 0x1000 will breakpoint when register sp is accessed and its value is less than or equal to 0x1000.

You can use the operator ‘&’ to mask the value you wish to break on. For example, (x & 1) == 1 will breakpoint when x is accessed and has an odd value.

You can use the operator ‘&&’ to combine comparisons. For example…

(x >= 2) && (x <= 14)

…will breakpoint when x is accessed and its value is between 2 and 14.

You can specify an arbitrary memory range using an array cast expression. For example, (char[256])(0x1000) will breakpoint when the memory region 0x1000–0x10FF is accessed.

You can specify an inverse memory range using the ! operator. For example !(char[256])(0x1000) will breakpoint when memory outside the range 0x1000–0x10FF is accessed.