Debugger State
Sometimes it is useful to keep a persistent state within the debugger.
The Engine::register_debugger
API accepts a function that returns the initial value of the
debugger’s state, which is a Dynamic
and can hold any value.
This state value is the stored into the debugger’s custom state.
Access the Debugger State
Use EvalContext::global_runtime_state().debugger()
(immutable) or
EvalContext::global_runtime_state_mut().debugger_mut()
(mutable) to gain access to the current
debugger::Debugger
instance.
The following debugger::Debugger
methods allow access to the custom debugger state.
Method | Parameter type | Return type | Description |
---|---|---|---|
state | none | &Dynamic | returns the custom state |
state_mut | none | &mut Dynamic | returns a mutable reference to the custom state |
set_state | impl Into<Dynamic> | none | sets the value of the custom state |
Example
engine.register_debugger(
|engine, mut debugger| {
// Say, use an object map for the debugger state
let mut state = Map::new();
// Initialize properties
state.insert("hello".into(), 42_64.into());
state.insert("foo".into(), false.into());
debugger.set_state(state);
debugger
},
|context, node, source, pos| {
// Print debugger state - which is an object map
let state = context.global_runtime_state().debugger().state();
println!("Current state = {state}");
// Get the state as an object map
let mut state = context.global_runtime_state_mut()
.debugger_mut().state_mut()
.write_lock::<Map>().unwrap();
// Read state
let hello = state.get("hello").unwrap().as_int().unwrap();
// Modify state
state.insert("hello".into(), (hello + 1).into());
state.insert("foo".into(), true.into());
state.insert("something_new".into(), "hello, world!".into());
// Continue with debugging
Ok(DebuggerCommand::StepInto)
}
);