Add debugging for only once per-line statement.

This commit is contained in:
Jacques Wagener 2018-10-15 17:41:31 +02:00
parent d044b2c38e
commit ea7f5f8887
No known key found for this signature in database
GPG Key ID: C294D1025DA0E923
2 changed files with 13 additions and 4 deletions

View File

@ -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})

View File

@ -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)