Skip to content

Commit 62cdb39

Browse files
Yuyupozherczeg
authored andcommitted
Add start to backtrace for debugger (#2407)
JerryScript-DCO-1.0-Signed-off-by: Daniella Barsony [email protected]
1 parent 04dcefe commit 62cdb39

File tree

5 files changed

+73
-25
lines changed

5 files changed

+73
-25
lines changed

jerry-core/debugger/debugger.c

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ jerry_debugger_send_backtrace (uint8_t *recv_buffer_p) /**< pointer to the recei
7878
{
7979
JERRY_DEBUGGER_RECEIVE_BUFFER_AS (jerry_debugger_receive_get_backtrace_t, get_backtrace_p);
8080

81+
uint32_t min_depth;
82+
memcpy (&min_depth, get_backtrace_p->min_depth, sizeof (uint32_t));
8183
uint32_t max_depth;
8284
memcpy (&max_depth, get_backtrace_p->max_depth, sizeof (uint32_t));
8385

@@ -96,35 +98,45 @@ jerry_debugger_send_backtrace (uint8_t *recv_buffer_p) /**< pointer to the recei
9698
const size_t max_frame_count = JERRY_DEBUGGER_SEND_MAX (jerry_debugger_frame_t);
9799
const size_t max_message_size = JERRY_DEBUGGER_SEND_SIZE (max_frame_count, jerry_debugger_frame_t);
98100

99-
while (frame_ctx_p != NULL && max_depth > 0)
101+
if (min_depth <= max_depth)
100102
{
101-
if (frame_ctx_p->bytecode_header_p->status_flags & CBC_CODE_FLAGS_DEBUGGER_IGNORE)
103+
uint32_t min_depth_offset = 0;
104+
105+
while (frame_ctx_p != NULL && min_depth_offset < min_depth)
102106
{
103107
frame_ctx_p = frame_ctx_p->prev_context_p;
104-
continue;
108+
min_depth_offset++;
105109
}
106110

107-
if (current_frame >= max_frame_count)
111+
while (frame_ctx_p != NULL && min_depth_offset++ < max_depth)
108112
{
109-
if (!jerry_debugger_send (max_message_size))
113+
if (frame_ctx_p->bytecode_header_p->status_flags & CBC_CODE_FLAGS_DEBUGGER_IGNORE)
110114
{
111-
return;
115+
frame_ctx_p = frame_ctx_p->prev_context_p;
116+
continue;
117+
}
118+
119+
if (current_frame >= max_frame_count)
120+
{
121+
if (!jerry_debugger_send (max_message_size))
122+
{
123+
return;
124+
}
125+
current_frame = 0;
112126
}
113-
current_frame = 0;
114-
}
115127

116-
jerry_debugger_frame_t *frame_p = backtrace_p->frames + current_frame;
128+
jerry_debugger_frame_t *frame_p = backtrace_p->frames + current_frame;
117129

118-
jmem_cpointer_t byte_code_cp;
119-
JMEM_CP_SET_NON_NULL_POINTER (byte_code_cp, frame_ctx_p->bytecode_header_p);
120-
memcpy (frame_p->byte_code_cp, &byte_code_cp, sizeof (jmem_cpointer_t));
130+
jmem_cpointer_t byte_code_cp;
131+
JMEM_CP_SET_NON_NULL_POINTER (byte_code_cp, frame_ctx_p->bytecode_header_p);
132+
memcpy (frame_p->byte_code_cp, &byte_code_cp, sizeof (jmem_cpointer_t));
121133

122-
uint32_t offset = (uint32_t) (frame_ctx_p->byte_code_p - (uint8_t *) frame_ctx_p->bytecode_header_p);
123-
memcpy (frame_p->offset, &offset, sizeof (uint32_t));
134+
uint32_t offset = (uint32_t) (frame_ctx_p->byte_code_p - (uint8_t *) frame_ctx_p->bytecode_header_p);
135+
memcpy (frame_p->offset, &offset, sizeof (uint32_t));
124136

125-
frame_ctx_p = frame_ctx_p->prev_context_p;
126-
current_frame++;
127-
max_depth--;
137+
frame_ctx_p = frame_ctx_p->prev_context_p;
138+
current_frame++;
139+
}
128140
}
129141

130142
size_t message_size = current_frame * sizeof (jerry_debugger_frame_t);

jerry-core/debugger/debugger.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ typedef struct
376376
typedef struct
377377
{
378378
uint8_t type; /**< type of the message */
379+
uint8_t min_depth[sizeof (uint32_t)]; /**< minimum depth*/
379380
uint8_t max_depth[sizeof (uint32_t)]; /**< maximum depth (0 - unlimited) */
380381
} jerry_debugger_receive_get_backtrace_t;
381382

jerry-debugger/jerry-client-ws.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,13 +200,14 @@ def __repr__(self):
200200

201201

202202
class DebuggerPrompt(Cmd):
203-
203+
# pylint: disable=too-many-instance-attributes,too-many-arguments
204204
def __init__(self, debugger):
205205
Cmd.__init__(self)
206206
self.debugger = debugger
207207
self.stop = False
208208
self.quit = False
209209
self.cont = True
210+
self.min_depth = 0
210211
self.non_interactive = False
211212
self.client_sources = []
212213

@@ -348,22 +349,36 @@ def do_delete(self, args):
348349
def do_backtrace(self, args):
349350
""" Get backtrace data from debugger """
350351
max_depth = 0
352+
self.min_depth = 0
351353

352354
if args:
355+
args = args.split(" ")
353356
try:
354-
max_depth = int(args)
355-
if max_depth <= 0:
356-
print("Error: Positive integer number expected")
357-
return
357+
if len(args) == 2:
358+
self.min_depth = int(args[0])
359+
max_depth = int(args[1])
360+
if max_depth <= 0 or self.min_depth < 0:
361+
print("Error: Positive integer number expected")
362+
return
363+
if self.min_depth > max_depth:
364+
print("Error: Start depth needs to be lower than or equal to max depth")
365+
return
366+
else:
367+
max_depth = int(args[0])
368+
if max_depth <= 0:
369+
print("Error: Positive integer number expected")
370+
return
371+
358372
except ValueError as val_errno:
359373
print("Error: Positive integer number expected, %s" % (val_errno))
360374
return
361375

362-
message = struct.pack(self.debugger.byte_order + "BBIB" + self.debugger.idx_format,
376+
message = struct.pack(self.debugger.byte_order + "BBIB" + self.debugger.idx_format + self.debugger.idx_format,
363377
WEBSOCKET_BINARY_FRAME | WEBSOCKET_FIN_BIT,
364-
WEBSOCKET_FIN_BIT + 1 + 4,
378+
WEBSOCKET_FIN_BIT + 1 + 4 + 4,
365379
0,
366380
JERRY_DEBUGGER_GET_BACKTRACE,
381+
self.min_depth,
367382
max_depth)
368383
self.debugger.send_message(message)
369384
self.stop = True
@@ -1199,7 +1214,10 @@ def main():
11991214
exception_string += data[3:]
12001215

12011216
elif buffer_type in [JERRY_DEBUGGER_BACKTRACE, JERRY_DEBUGGER_BACKTRACE_END]:
1202-
frame_index = 0
1217+
if prompt.min_depth != 0:
1218+
frame_index = prompt.min_depth
1219+
else:
1220+
frame_index = 0
12031221

12041222
while True:
12051223

tests/debugger/do_backtrace.cmd

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@ next
44
step
55
next
66
s
7+
bt 1 2
78
bt
9+
bt 2
810
n
911
n
1012
s
1113
backtrace
14+
bt 4 4
15+
bt 600 919
16+
bt 3 500
17+
bt 4 3
1218
c

tests/debugger/do_backtrace.expected

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,15 @@ out: function test
1414
Stopped at tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1)
1515
(jerry-debugger) s
1616
Stopped at tests/debugger/do_backtrace.js:23 (in foo() at line:21, col:1)
17+
(jerry-debugger) bt 1 2
18+
Frame 1: tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1)
1719
(jerry-debugger) bt
1820
Frame 0: tests/debugger/do_backtrace.js:23 (in foo() at line:21, col:1)
1921
Frame 1: tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1)
2022
Frame 2: tests/debugger/do_backtrace.js:40
23+
(jerry-debugger) bt 2
24+
Frame 0: tests/debugger/do_backtrace.js:23 (in foo() at line:21, col:1)
25+
Frame 1: tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1)
2126
(jerry-debugger) n
2227
out: function foo
2328
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)
3035
Frame 1: tests/debugger/do_backtrace.js:25 (in foo() at line:21, col:1)
3136
Frame 2: tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1)
3237
Frame 3: tests/debugger/do_backtrace.js:40
38+
(jerry-debugger) bt 4 4
39+
(jerry-debugger) bt 600 919
40+
(jerry-debugger) bt 3 500
41+
Frame 3: tests/debugger/do_backtrace.js:40
42+
(jerry-debugger) bt 4 3
43+
Error: Start depth needs to be lower than or equal to max depth
3344
(jerry-debugger) c
3445
out: function f4

0 commit comments

Comments
 (0)