Watchpoints
Overview of the watch command.
About
A watchpoint is a data breakpoint. This means the program stops when the variable (or expression, or raw memory region)
being observed by the watchpoint is changed. Currently, watchpoints are based on x86-64 hardware breakpoints, which
introduces two limitations:
- Only 4 watchpoints can be active at once.
- Watchpoints can only observe memory regions of 1, 2, 4, or 8 bytes in size.
Setting watchpoints
You can set a watchpoint on variables (global or local) or on expressions involving variables. Watchpoints for local variables are automatically removed when the variable goes out of scope. If a watchpoint observes a global variable, it remains active as long as the debugger is running.
Watchpoints are set with the watch (or just w) command:
watch [+rw][+w] ( <addr>:<size> | <DQE> )- set write or read-write watchpoint (write by default) for a memory location (size must be one of [1,2,4,8] bytes) or DQE with variablewatch remove ( <addr>:<size> | <expression> | <number> )- deactivate and delete the selected watchpointwatch info- show all watchpoints
Some examples of setting watchpoints:
watch my_var(alias:w my_var) - stop when variable value is rewrittenwatch +rw my_var- stop when variable value is read or rewrittenwatch my_vector[0]- stop when the first vector element is rewrittenwatch (~my_vector).len- stop when vector length changeswatch 0x100:4- stop when writing to memory region [0x100:0x103]
Usage example
Consider this Rust function:
fn calculate_and_print(mut val: i32) {
val += 1;
val += 2;
val -= 5;
print!("{val}");
}
Let's watch the val argument: