From 62cdb3965fd1c5b4685dc80e65fa056dd39b0e47 Mon Sep 17 00:00:00 2001 From: Daniella Barsony Date: Thu, 12 Jul 2018 12:44:54 +0200 Subject: [PATCH] Add start to backtrace for debugger (#2407) JerryScript-DCO-1.0-Signed-off-by: Daniella Barsony bella@inf.u-szeged.hu --- jerry-core/debugger/debugger.c | 52 +++++++++++++++++----------- jerry-core/debugger/debugger.h | 1 + jerry-debugger/jerry-client-ws.py | 34 +++++++++++++----- tests/debugger/do_backtrace.cmd | 6 ++++ tests/debugger/do_backtrace.expected | 11 ++++++ 5 files changed, 76 insertions(+), 28 deletions(-) diff --git a/jerry-core/debugger/debugger.c b/jerry-core/debugger/debugger.c index 9ffd05f87..a3591ad70 100644 --- a/jerry-core/debugger/debugger.c +++ b/jerry-core/debugger/debugger.c @@ -78,6 +78,8 @@ jerry_debugger_send_backtrace (uint8_t *recv_buffer_p) /**< pointer to the recei { JERRY_DEBUGGER_RECEIVE_BUFFER_AS (jerry_debugger_receive_get_backtrace_t, get_backtrace_p); + uint32_t min_depth; + memcpy (&min_depth, get_backtrace_p->min_depth, sizeof (uint32_t)); uint32_t max_depth; memcpy (&max_depth, get_backtrace_p->max_depth, sizeof (uint32_t)); @@ -96,35 +98,45 @@ jerry_debugger_send_backtrace (uint8_t *recv_buffer_p) /**< pointer to the recei const size_t max_frame_count = JERRY_DEBUGGER_SEND_MAX (jerry_debugger_frame_t); const size_t max_message_size = JERRY_DEBUGGER_SEND_SIZE (max_frame_count, jerry_debugger_frame_t); - while (frame_ctx_p != NULL && max_depth > 0) + if (min_depth <= max_depth) { - if (frame_ctx_p->bytecode_header_p->status_flags & CBC_CODE_FLAGS_DEBUGGER_IGNORE) + uint32_t min_depth_offset = 0; + + while (frame_ctx_p != NULL && min_depth_offset < min_depth) { frame_ctx_p = frame_ctx_p->prev_context_p; - continue; + min_depth_offset++; } - if (current_frame >= max_frame_count) + while (frame_ctx_p != NULL && min_depth_offset++ < max_depth) { - if (!jerry_debugger_send (max_message_size)) + if (frame_ctx_p->bytecode_header_p->status_flags & CBC_CODE_FLAGS_DEBUGGER_IGNORE) { - return; + frame_ctx_p = frame_ctx_p->prev_context_p; + continue; } - current_frame = 0; + + if (current_frame >= max_frame_count) + { + if (!jerry_debugger_send (max_message_size)) + { + return; + } + current_frame = 0; + } + + jerry_debugger_frame_t *frame_p = backtrace_p->frames + current_frame; + + jmem_cpointer_t byte_code_cp; + JMEM_CP_SET_NON_NULL_POINTER (byte_code_cp, frame_ctx_p->bytecode_header_p); + memcpy (frame_p->byte_code_cp, &byte_code_cp, sizeof (jmem_cpointer_t)); + + uint32_t offset = (uint32_t) (frame_ctx_p->byte_code_p - (uint8_t *) frame_ctx_p->bytecode_header_p); + memcpy (frame_p->offset, &offset, sizeof (uint32_t)); + + frame_ctx_p = frame_ctx_p->prev_context_p; + current_frame++; } - - jerry_debugger_frame_t *frame_p = backtrace_p->frames + current_frame; - - jmem_cpointer_t byte_code_cp; - JMEM_CP_SET_NON_NULL_POINTER (byte_code_cp, frame_ctx_p->bytecode_header_p); - memcpy (frame_p->byte_code_cp, &byte_code_cp, sizeof (jmem_cpointer_t)); - - uint32_t offset = (uint32_t) (frame_ctx_p->byte_code_p - (uint8_t *) frame_ctx_p->bytecode_header_p); - memcpy (frame_p->offset, &offset, sizeof (uint32_t)); - - frame_ctx_p = frame_ctx_p->prev_context_p; - current_frame++; - max_depth--; } size_t message_size = current_frame * sizeof (jerry_debugger_frame_t); diff --git a/jerry-core/debugger/debugger.h b/jerry-core/debugger/debugger.h index b53500711..402394386 100644 --- a/jerry-core/debugger/debugger.h +++ b/jerry-core/debugger/debugger.h @@ -376,6 +376,7 @@ typedef struct typedef struct { uint8_t type; /**< type of the message */ + uint8_t min_depth[sizeof (uint32_t)]; /**< minimum depth*/ uint8_t max_depth[sizeof (uint32_t)]; /**< maximum depth (0 - unlimited) */ } jerry_debugger_receive_get_backtrace_t; diff --git a/jerry-debugger/jerry-client-ws.py b/jerry-debugger/jerry-client-ws.py index 15b152f04..6afb411b5 100755 --- a/jerry-debugger/jerry-client-ws.py +++ b/jerry-debugger/jerry-client-ws.py @@ -200,13 +200,14 @@ class JerryFunction(object): class DebuggerPrompt(Cmd): - + # pylint: disable=too-many-instance-attributes,too-many-arguments def __init__(self, debugger): Cmd.__init__(self) self.debugger = debugger self.stop = False self.quit = False self.cont = True + self.min_depth = 0 self.non_interactive = False self.client_sources = [] @@ -348,22 +349,36 @@ class DebuggerPrompt(Cmd): def do_backtrace(self, args): """ Get backtrace data from debugger """ max_depth = 0 + self.min_depth = 0 if args: + args = args.split(" ") try: - max_depth = int(args) - if max_depth <= 0: - print("Error: Positive integer number expected") - return + if len(args) == 2: + self.min_depth = int(args[0]) + max_depth = int(args[1]) + if max_depth <= 0 or self.min_depth < 0: + print("Error: Positive integer number expected") + return + if self.min_depth > max_depth: + print("Error: Start depth needs to be lower than or equal to max depth") + return + else: + max_depth = int(args[0]) + if max_depth <= 0: + print("Error: Positive integer number expected") + return + except ValueError as val_errno: print("Error: Positive integer number expected, %s" % (val_errno)) return - message = struct.pack(self.debugger.byte_order + "BBIB" + self.debugger.idx_format, + message = struct.pack(self.debugger.byte_order + "BBIB" + self.debugger.idx_format + self.debugger.idx_format, WEBSOCKET_BINARY_FRAME | WEBSOCKET_FIN_BIT, - WEBSOCKET_FIN_BIT + 1 + 4, + WEBSOCKET_FIN_BIT + 1 + 4 + 4, 0, JERRY_DEBUGGER_GET_BACKTRACE, + self.min_depth, max_depth) self.debugger.send_message(message) self.stop = True @@ -1199,7 +1214,10 @@ def main(): exception_string += data[3:] elif buffer_type in [JERRY_DEBUGGER_BACKTRACE, JERRY_DEBUGGER_BACKTRACE_END]: - frame_index = 0 + if prompt.min_depth != 0: + frame_index = prompt.min_depth + else: + frame_index = 0 while True: diff --git a/tests/debugger/do_backtrace.cmd b/tests/debugger/do_backtrace.cmd index bb6babbae..bcb56c74f 100644 --- a/tests/debugger/do_backtrace.cmd +++ b/tests/debugger/do_backtrace.cmd @@ -4,9 +4,15 @@ next step next s +bt 1 2 bt +bt 2 n n s backtrace +bt 4 4 +bt 600 919 +bt 3 500 +bt 4 3 c diff --git a/tests/debugger/do_backtrace.expected b/tests/debugger/do_backtrace.expected index 69424bd6d..679fcb8de 100644 --- a/tests/debugger/do_backtrace.expected +++ b/tests/debugger/do_backtrace.expected @@ -14,10 +14,15 @@ out: function test Stopped at tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1) (jerry-debugger) s Stopped at tests/debugger/do_backtrace.js:23 (in foo() at line:21, col:1) +(jerry-debugger) bt 1 2 +Frame 1: tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1) (jerry-debugger) bt Frame 0: tests/debugger/do_backtrace.js:23 (in foo() at line:21, col:1) Frame 1: tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1) Frame 2: tests/debugger/do_backtrace.js:40 +(jerry-debugger) bt 2 +Frame 0: tests/debugger/do_backtrace.js:23 (in foo() at line:21, col:1) +Frame 1: tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1) (jerry-debugger) n out: function foo Stopped at tests/debugger/do_backtrace.js:24 (in foo() at line:21, col:1) @@ -30,5 +35,11 @@ Frame 0: tests/debugger/do_backtrace.js:18 (in f4() at line:17, col:1) Frame 1: tests/debugger/do_backtrace.js:25 (in foo() at line:21, col:1) Frame 2: tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1) Frame 3: tests/debugger/do_backtrace.js:40 +(jerry-debugger) bt 4 4 +(jerry-debugger) bt 600 919 +(jerry-debugger) bt 3 500 +Frame 3: tests/debugger/do_backtrace.js:40 +(jerry-debugger) bt 4 3 +Error: Start depth needs to be lower than or equal to max depth (jerry-debugger) c out: function f4