Fix inserting pending breakpoints. (#2163)

Before this patch the JS execution is started right after the parsing
is completed. The problem is that some parts of the JS code is executed
before the debugger had any chance to insert pending breakpoints due
to network latency. This patch adds a delay after parsing when at least
one pendding breakpoint is available.

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2018-01-23 10:47:47 +01:00
committed by GitHub
parent 40d05cdca2
commit 1c64c1aeb7
11 changed files with 271 additions and 147 deletions
+28 -25
View File
@@ -51,19 +51,20 @@ var JERRY_DEBUGGER_SOURCE_CODE_NAME = 9;
var JERRY_DEBUGGER_SOURCE_CODE_NAME_END = 10;
var JERRY_DEBUGGER_FUNCTION_NAME = 11;
var JERRY_DEBUGGER_FUNCTION_NAME_END = 12;
var JERRY_DEBUGGER_RELEASE_BYTE_CODE_CP = 13;
var JERRY_DEBUGGER_MEMSTATS_RECEIVE = 14;
var JERRY_DEBUGGER_BREAKPOINT_HIT = 15;
var JERRY_DEBUGGER_EXCEPTION_HIT = 16;
var JERRY_DEBUGGER_EXCEPTION_STR = 17;
var JERRY_DEBUGGER_EXCEPTION_STR_END = 18;
var JERRY_DEBUGGER_BACKTRACE = 19;
var JERRY_DEBUGGER_BACKTRACE_END = 20;
var JERRY_DEBUGGER_EVAL_RESULT = 21;
var JERRY_DEBUGGER_EVAL_RESULT_END = 22;
var JERRY_DEBUGGER_WAIT_FOR_SOURCE = 23;
var JERRY_DEBUGGER_OUTPUT_RESULT = 24;
var JERRY_DEBUGGER_OUTPUT_RESULT_END = 25;
var JERRY_DEBUGGER_WAITING_AFTER_PARSE = 13;
var JERRY_DEBUGGER_RELEASE_BYTE_CODE_CP = 14;
var JERRY_DEBUGGER_MEMSTATS_RECEIVE = 15;
var JERRY_DEBUGGER_BREAKPOINT_HIT = 16;
var JERRY_DEBUGGER_EXCEPTION_HIT = 17;
var JERRY_DEBUGGER_EXCEPTION_STR = 18;
var JERRY_DEBUGGER_EXCEPTION_STR_END = 19;
var JERRY_DEBUGGER_BACKTRACE = 20;
var JERRY_DEBUGGER_BACKTRACE_END = 21;
var JERRY_DEBUGGER_EVAL_RESULT = 22;
var JERRY_DEBUGGER_EVAL_RESULT_END = 23;
var JERRY_DEBUGGER_WAIT_FOR_SOURCE = 24;
var JERRY_DEBUGGER_OUTPUT_RESULT = 25;
var JERRY_DEBUGGER_OUTPUT_RESULT_END = 26;
// Subtypes of eval
var JERRY_DEBUGGER_EVAL_OK = 1;
@@ -80,18 +81,20 @@ var JERRY_DEBUGGER_OUTPUT_TRACE = 5;
var JERRY_DEBUGGER_FREE_BYTE_CODE_CP = 1;
var JERRY_DEBUGGER_UPDATE_BREAKPOINT = 2;
var JERRY_DEBUGGER_EXCEPTION_CONFIG = 3;
var JERRY_DEBUGGER_MEMSTATS = 4;
var JERRY_DEBUGGER_STOP = 5;
var JERRY_DEBUGGER_CLIENT_SOURCE = 6;
var JERRY_DEBUGGER_CLIENT_SOURCE_PART = 7;
var JERRY_DEBUGGER_NO_MORE_SOURCES = 8;
var JERRY_DEBUGGER_CONTEXT_RESET = 9;
var JERRY_DEBUGGER_CONTINUE = 10;
var JERRY_DEBUGGER_STEP = 11;
var JERRY_DEBUGGER_NEXT = 12;
var JERRY_DEBUGGER_GET_BACKTRACE = 13;
var JERRY_DEBUGGER_EVAL = 14;
var JERRY_DEBUGGER_EVAL_PART = 15;
var JERRY_DEBUGGER_PARSER_CONFIG = 4;
var JERRY_DEBUGGER_MEMSTATS = 5;
var JERRY_DEBUGGER_STOP = 6;
var JERRY_DEBUGGER_PARSER_RESUME = 7;
var JERRY_DEBUGGER_CLIENT_SOURCE = 8;
var JERRY_DEBUGGER_CLIENT_SOURCE_PART = 9;
var JERRY_DEBUGGER_NO_MORE_SOURCES = 10;
var JERRY_DEBUGGER_CONTEXT_RESET = 11;
var JERRY_DEBUGGER_CONTINUE = 12;
var JERRY_DEBUGGER_STEP = 13;
var JERRY_DEBUGGER_NEXT = 14;
var JERRY_DEBUGGER_GET_BACKTRACE = 15;
var JERRY_DEBUGGER_EVAL = 16;
var JERRY_DEBUGGER_EVAL_PART = 17;
var textBox = document.getElementById("log");
var commandBox = document.getElementById("command");
+68 -44
View File
@@ -41,19 +41,20 @@ JERRY_DEBUGGER_SOURCE_CODE_NAME = 9
JERRY_DEBUGGER_SOURCE_CODE_NAME_END = 10
JERRY_DEBUGGER_FUNCTION_NAME = 11
JERRY_DEBUGGER_FUNCTION_NAME_END = 12
JERRY_DEBUGGER_RELEASE_BYTE_CODE_CP = 13
JERRY_DEBUGGER_MEMSTATS_RECEIVE = 14
JERRY_DEBUGGER_BREAKPOINT_HIT = 15
JERRY_DEBUGGER_EXCEPTION_HIT = 16
JERRY_DEBUGGER_EXCEPTION_STR = 17
JERRY_DEBUGGER_EXCEPTION_STR_END = 18
JERRY_DEBUGGER_BACKTRACE = 19
JERRY_DEBUGGER_BACKTRACE_END = 20
JERRY_DEBUGGER_EVAL_RESULT = 21
JERRY_DEBUGGER_EVAL_RESULT_END = 22
JERRY_DEBUGGER_WAIT_FOR_SOURCE = 23
JERRY_DEBUGGER_OUTPUT_RESULT = 24
JERRY_DEBUGGER_OUTPUT_RESULT_END = 25
JERRY_DEBUGGER_WAITING_AFTER_PARSE = 13
JERRY_DEBUGGER_RELEASE_BYTE_CODE_CP = 14
JERRY_DEBUGGER_MEMSTATS_RECEIVE = 15
JERRY_DEBUGGER_BREAKPOINT_HIT = 16
JERRY_DEBUGGER_EXCEPTION_HIT = 17
JERRY_DEBUGGER_EXCEPTION_STR = 18
JERRY_DEBUGGER_EXCEPTION_STR_END = 19
JERRY_DEBUGGER_BACKTRACE = 20
JERRY_DEBUGGER_BACKTRACE_END = 21
JERRY_DEBUGGER_EVAL_RESULT = 22
JERRY_DEBUGGER_EVAL_RESULT_END = 23
JERRY_DEBUGGER_WAIT_FOR_SOURCE = 24
JERRY_DEBUGGER_OUTPUT_RESULT = 25
JERRY_DEBUGGER_OUTPUT_RESULT_END = 26
# Subtypes of eval
JERRY_DEBUGGER_EVAL_OK = 1
@@ -71,18 +72,20 @@ JERRY_DEBUGGER_OUTPUT_TRACE = 5
JERRY_DEBUGGER_FREE_BYTE_CODE_CP = 1
JERRY_DEBUGGER_UPDATE_BREAKPOINT = 2
JERRY_DEBUGGER_EXCEPTION_CONFIG = 3
JERRY_DEBUGGER_MEMSTATS = 4
JERRY_DEBUGGER_STOP = 5
JERRY_DEBUGGER_CLIENT_SOURCE = 6
JERRY_DEBUGGER_CLIENT_SOURCE_PART = 7
JERRY_DEBUGGER_NO_MORE_SOURCES = 8
JERRY_DEBUGGER_CONTEXT_RESET = 9
JERRY_DEBUGGER_CONTINUE = 10
JERRY_DEBUGGER_STEP = 11
JERRY_DEBUGGER_NEXT = 12
JERRY_DEBUGGER_GET_BACKTRACE = 13
JERRY_DEBUGGER_EVAL = 14
JERRY_DEBUGGER_EVAL_PART = 15
JERRY_DEBUGGER_PARSER_CONFIG = 4
JERRY_DEBUGGER_MEMSTATS = 5
JERRY_DEBUGGER_STOP = 6
JERRY_DEBUGGER_PARSER_RESUME = 7
JERRY_DEBUGGER_CLIENT_SOURCE = 8
JERRY_DEBUGGER_CLIENT_SOURCE_PART = 9
JERRY_DEBUGGER_NO_MORE_SOURCES = 10
JERRY_DEBUGGER_CONTEXT_RESET = 11
JERRY_DEBUGGER_CONTINUE = 12
JERRY_DEBUGGER_STEP = 13
JERRY_DEBUGGER_NEXT = 14
JERRY_DEBUGGER_GET_BACKTRACE = 15
JERRY_DEBUGGER_EVAL = 16
JERRY_DEBUGGER_EVAL_PART = 17
MAX_BUFFER_SIZE = 128
WEBSOCKET_BINARY_FRAME = 2
@@ -315,6 +318,8 @@ class DebuggerPrompt(Cmd):
self.debugger.send_breakpoint(breakpoint)
elif breakpoint_index in self.debugger.pending_breakpoint_list:
del self.debugger.pending_breakpoint_list[breakpoint_index]
if not self.debugger.pending_breakpoint_list:
self.debugger.send_parser_config(0)
else:
print("Error: Breakpoint %d not found" % (breakpoint_index))
@@ -636,7 +641,9 @@ class JerryDebugger(object):
self.send_breakpoint(breakpoint)
def delete_pending(self):
self.pending_breakpoint_list.clear()
if self.pending_breakpoint_list:
self.pending_breakpoint_list.clear()
self.send_parser_config(0)
def breakpoint_pending_exists(self, breakpoint):
for existing_bp in self.pending_breakpoint_list.values():
@@ -684,13 +691,22 @@ class JerryDebugger(object):
enable)
self.send_message(message)
def send_parser_config(self, enable):
message = struct.pack(self.byte_order + "BBIBB",
WEBSOCKET_BINARY_FRAME | WEBSOCKET_FIN_BIT,
WEBSOCKET_FIN_BIT + 1 + 1,
0,
JERRY_DEBUGGER_PARSER_CONFIG,
enable)
self.send_message(message)
def set_colors(self):
self.green = '\033[92m'
self.nocolor = '\033[0m'
self.green = '\033[92m'
self.red = '\033[31m'
self.yellow = '\033[93m'
self.green_bg = '\033[42m'
self.yellow_bg = '\033[43m'
self.green_bg = '\033[42m\033[30m'
self.yellow_bg = '\033[43m\033[30m'
self.blue = '\033[94m'
def get_message(self, blocking):
@@ -843,29 +859,29 @@ def parse_source(debugger, data):
debugger.line_list.insert(line, breakpoint)
# Try to set the pending breakpoints
if len(debugger.pending_breakpoint_list) != 0:
if debugger.pending_breakpoint_list:
logging.debug("Pending breakpoints list: %s", debugger.pending_breakpoint_list)
bp_list = debugger.pending_breakpoint_list
for breakpoint in bp_list:
for breakpoint_index, breakpoint in bp_list.items():
for src in debugger.function_list.values():
if src.source_name == bp_list[breakpoint].source_name:
if src.source_name == breakpoint.source_name:
source_lines = len(src.source)
else:
source_lines = 0
if bp_list[breakpoint].line:
if bp_list[breakpoint].line <= source_lines:
tmp_bp = breakpoint
breakpoint = bp_list[breakpoint].source_name + ":" + str(bp_list[breakpoint].line)
if set_breakpoint(debugger, breakpoint, True):
del tmp_bp
elif bp_list[breakpoint].function:
tmp_bp = breakpoint
breakpoint = bp_list[breakpoint].function
if set_breakpoint(debugger, breakpoint, True):
del tmp_bp
if breakpoint.line:
if breakpoint.line <= source_lines:
command = breakpoint.source_name + ":" + str(breakpoint.line)
if set_breakpoint(debugger, command, True):
del bp_list[breakpoint_index]
elif breakpoint.function:
command = breakpoint.function
if set_breakpoint(debugger, command, True):
del bp_list[breakpoint_index]
if not bp_list:
debugger.send_parser_config(0)
else:
logging.debug("No pending breakpoints")
@@ -971,14 +987,19 @@ def set_breakpoint(debugger, string, pending):
if not found and not pending:
print("No breakpoint found, do you want to add a %spending breakpoint%s? (y or [n])" % \
(debugger.yellow, debugger.nocolor))
(debugger.yellow, debugger.nocolor))
ans = sys.stdin.readline()
if ans in ['yes\n', 'y\n']:
if not debugger.pending_breakpoint_list:
debugger.send_parser_config(1)
if line:
breakpoint = JerryPendingBreakpoint(int(line.group(2)), line.group(1))
else:
breakpoint = JerryPendingBreakpoint(function=string)
enable_breakpoint(debugger, breakpoint)
elif not found and pending:
return False
@@ -1062,6 +1083,9 @@ def main():
JERRY_DEBUGGER_FUNCTION_NAME_END]:
parse_source(debugger, data)
elif buffer_type == JERRY_DEBUGGER_WAITING_AFTER_PARSE:
debugger.send_command(JERRY_DEBUGGER_PARSER_RESUME)
elif buffer_type == JERRY_DEBUGGER_RELEASE_BYTE_CODE_CP:
release_function(debugger, data)