evm v0.1.14 EVM.Debugger.Breakpoint
Breakpoints allow us to break execution of a given contract based on a set of conditions.
Link to this section Summary
Functions
Clears the pc so that this breakpoint doesn’t continue breaking
Describes a breakpoint’s trigger conditions
Disables a given breakpoint
Enables a given breakpoint
Gets a breakpoint by id. This will raise if no such breakpoint is found
Returns all active breakpoints
Initializes the debugger. Must be called prior to getting or checking breakpoints
Returns true if a given breakpoint matches the current execution environment
Adds a global breakpoint condition
Sets the pc to next so that this breakpoint will likely break on the next run
Link to this section Types
t() :: %EVM.Debugger.Breakpoint{conditions: keyword(conditions), enabled: boolean, id: id, pc: nil | :start | :next | integer}
Link to this section Functions
break_on_next_pc?(t, EVM.MachineState.program_counter) :: boolean
clear_pc_if_one_time_break(id) :: Breakpoint.t
Clears the pc so that this breakpoint doesn’t continue breaking.
Examples
iex> id = EVM.Debugger.Breakpoint.set_breakpoint(%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>], pc: :next})
iex> EVM.Debugger.Breakpoint.clear_pc_if_one_time_break(id) |> Map.put(:id, nil)
%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>], pc: nil}
iex> id = EVM.Debugger.Breakpoint.set_breakpoint(%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>], pc: :start})
iex> EVM.Debugger.Breakpoint.clear_pc_if_one_time_break(id) |> Map.put(:id, nil)
%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>], pc: nil}
iex> id = EVM.Debugger.Breakpoint.set_breakpoint(%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>], pc: 5})
iex> EVM.Debugger.Breakpoint.clear_pc_if_one_time_break(id) |> Map.put(:id, nil)
%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>], pc: 5}
Describes a breakpoint’s trigger conditions.
Examples
iex> %EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>], pc: :next} |> EVM.Debugger.Breakpoint.describe
"contract address 0x0000000000000000000000000000000000000014 (next)"
iex> %EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>], pc: :start} |> EVM.Debugger.Breakpoint.describe
"contract address 0x0000000000000000000000000000000000000014 (start)"
iex> %EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>], pc: nil} |> EVM.Debugger.Breakpoint.describe
"contract address 0x0000000000000000000000000000000000000014 (waiting)"
iex> %EVM.Debugger.Breakpoint{conditions: [], pc: nil} |> EVM.Debugger.Breakpoint.describe
"(waiting)"
Disables a given breakpoint.
Examples
iex> id = EVM.Debugger.Breakpoint.set_breakpoint(%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>]})
iex> EVM.Debugger.Breakpoint.disable_breakpoint(id) |> Map.put(:id, nil)
%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>], enabled: false}
Enables a given breakpoint.
Examples
iex> id = EVM.Debugger.Breakpoint.set_breakpoint(%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>], enabled: false})
iex> EVM.Debugger.Breakpoint.enable_breakpoint(id) |> Map.put(:id, nil)
%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>], enabled: true}
Gets a breakpoint by id. This will raise if no such breakpoint is found.
Examples
iex> id = EVM.Debugger.Breakpoint.set_breakpoint(%EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>]})
iex> EVM.Debugger.Breakpoint.get_breakpoint(id) |> Map.put(:id, nil)
%EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>]}
iex> EVM.Debugger.Breakpoint.get_breakpoint(999)
** (CaseClauseError) no case clause matching: []
Returns all active breakpoints.
Examples
iex> id = EVM.Debugger.Breakpoint.set_breakpoint(%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>]})
iex> breakpoint = EVM.Debugger.Breakpoint.get_breakpoint(id)
iex> breakpoints = EVM.Debugger.Breakpoint.get_breakpoints()
iex> breakpoints |> Enum.count > 0
true
iex> breakpoints |> Enum.member?(breakpoint)
true
Initializes the debugger. Must be called prior to getting or checking breakpoints.
matches?(t, EVM.MachineState.t, EVM.SubState.t, EVM.ExecEnv.t) :: boolean
Returns true if a given breakpoint matches the current execution environment.
Note: we currently only support address matching.
Examples
iex> breakpoint = %EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>], pc: :next}
iex> machine_state = %EVM.MachineState{}
iex> sub_state = %EVM.SubState{}
iex> exec_env = %EVM.ExecEnv{address: <<20::160>>}
iex> EVM.Debugger.Breakpoint.matches?(breakpoint, machine_state, sub_state, exec_env)
true
iex> breakpoint = %EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>], pc: 999}
iex> machine_state = %EVM.MachineState{}
iex> sub_state = %EVM.SubState{}
iex> exec_env = %EVM.ExecEnv{address: <<20::160>>}
iex> EVM.Debugger.Breakpoint.matches?(breakpoint, machine_state, sub_state, exec_env)
false
iex> breakpoint = %EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>], pc: 999}
iex> machine_state = %EVM.MachineState{program_counter: 999}
iex> sub_state = %EVM.SubState{}
iex> exec_env = %EVM.ExecEnv{address: <<20::160>>}
iex> EVM.Debugger.Breakpoint.matches?(breakpoint, machine_state, sub_state, exec_env)
true
iex> breakpoint = %EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>], pc: nil}
iex> machine_state = %EVM.MachineState{program_counter: 999}
iex> sub_state = %EVM.SubState{}
iex> exec_env = %EVM.ExecEnv{address: <<20::160>>}
iex> EVM.Debugger.Breakpoint.matches?(breakpoint, machine_state, sub_state, exec_env)
false
iex> breakpoint = %EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>], enabled: false, pc: :next}
iex> machine_state = %EVM.MachineState{}
iex> sub_state = %EVM.SubState{}
iex> exec_env = %EVM.ExecEnv{address: <<20::160>>}
iex> EVM.Debugger.Breakpoint.matches?(breakpoint, machine_state, sub_state, exec_env)
false
iex> breakpoint = %EVM.Debugger.Breakpoint{conditions: [address: <<20::160>>], pc: :next}
iex> machine_state = %EVM.MachineState{}
iex> sub_state = %EVM.SubState{}
iex> exec_env = %EVM.ExecEnv{address: <<21::160>>}
iex> EVM.Debugger.Breakpoint.matches?(breakpoint, machine_state, sub_state, exec_env)
false
Adds a global breakpoint condition.
We can set the following types of breakpoints: …
Examples
iex> id = EVM.Debugger.Breakpoint.set_breakpoint(%EVM.Debugger.Breakpoint{conditions: [address: <<15::160>>]})
iex> EVM.Debugger.Breakpoint.get_breakpoint(id) |> Map.put(:id, nil)
%EVM.Debugger.Breakpoint{conditions: [address: <<15::160>>]}
Sets the pc to next so that this breakpoint will likely break on the next run.
Examples
iex> id = EVM.Debugger.Breakpoint.set_breakpoint(%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>]})
iex> EVM.Debugger.Breakpoint.set_next(id) |> Map.put(:id, nil)
%EVM.Debugger.Breakpoint{conditions: [address: <<1::160>>], pc: :next}