Add debugging for only once per-line statement.
This commit is contained in:
parent
d044b2c38e
commit
ea7f5f8887
|
@ -12,6 +12,7 @@ from vdb.eth_tester_debug_backend import (
|
|||
PyEVMDebugBackend,
|
||||
set_debug_info
|
||||
)
|
||||
import vdb.debug_computation
|
||||
from web3.providers.eth_tester import (
|
||||
EthereumTesterProvider,
|
||||
)
|
||||
|
@ -165,7 +166,9 @@ if __name__ == '__main__':
|
|||
|
||||
cast_args = cast_types(args, func_abi)
|
||||
|
||||
setattr(vdb.debug_computation.DebugComputation, 'enable_debug', True)
|
||||
res = getattr(contract.functions, func_name)(*cast_args).call({'gas': func_abi.get('gas', 0) + 50000})
|
||||
setattr(vdb.debug_computation.DebugComputation, 'enable_debug', False)
|
||||
|
||||
tx_hash = getattr(contract.functions, func_name)(*cast_args).transact({'gas': func_abi.get('gas', 0) + 50000})
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ from vdb.vdb import VyperDebugCmd
|
|||
|
||||
|
||||
class DebugComputation(ByzantiumComputation):
|
||||
enable_debug = False
|
||||
source_code = None
|
||||
source_map = None
|
||||
|
||||
|
@ -21,6 +22,7 @@ class DebugComputation(ByzantiumComputation):
|
|||
stdin=None,
|
||||
stdout=None
|
||||
).cmdloop()
|
||||
return line_no
|
||||
|
||||
@classmethod
|
||||
def get_line_no(cls, pc):
|
||||
|
@ -29,10 +31,12 @@ class DebugComputation(ByzantiumComputation):
|
|||
return pc_pos_map[pc][0]
|
||||
|
||||
@classmethod
|
||||
def is_breakpoint(cls, pc):
|
||||
def is_breakpoint(cls, pc, continue_line_nos):
|
||||
breakpoint_lines = cls.source_map['line_number_map']['breakpoints']
|
||||
line_no = cls.get_line_no(pc)
|
||||
if line_no is not None:
|
||||
if line_no in continue_line_nos: # already been here, skip.
|
||||
return False, line_no
|
||||
return line_no in breakpoint_lines, line_no
|
||||
return False, None
|
||||
|
||||
|
@ -46,6 +50,7 @@ class DebugComputation(ByzantiumComputation):
|
|||
computation.precompiles[message.code_address](computation)
|
||||
return computation
|
||||
|
||||
continue_line_nos = []
|
||||
for opcode in computation.code:
|
||||
opcode_fn = computation.get_opcode_fn(opcode)
|
||||
|
||||
|
@ -57,10 +62,11 @@ class DebugComputation(ByzantiumComputation):
|
|||
pc_to_execute,
|
||||
)
|
||||
|
||||
is_breakpoint, line_no = cls.is_breakpoint(pc_to_execute)
|
||||
if is_breakpoint:
|
||||
# import ipdb; ipdb.set_trace()
|
||||
is_breakpoint, line_no = cls.is_breakpoint(pc_to_execute, continue_line_nos)
|
||||
|
||||
if is_breakpoint and cls.enable_debug:
|
||||
cls.run_debugger(computation, line_no)
|
||||
continue_line_nos.append(line_no)
|
||||
|
||||
try:
|
||||
opcode_fn(computation=computation)
|
||||
|
|
Loading…
Reference in New Issue