Author: Armin Rigo <ar...@tunes.org> Branch: reverse-debugger Changeset: r85336:1a7eac6b97b3 Date: 2016-06-22 18:32 +0200 http://bitbucket.org/pypy/pypy/changeset/1a7eac6b97b3/
Log: updates diff --git a/rpython/rlib/revdb.py b/rpython/rlib/revdb.py --- a/rpython/rlib/revdb.py +++ b/rpython/rlib/revdb.py @@ -116,11 +116,11 @@ # ____________________________________________________________ -@specialize.arg(2) -def _change_time(mode, time, callback): - ll_callback = llhelper(_CALLBACK_NOARG_FNPTR, callback) - llop.revdb_change_time(lltype.Void, mode, time, ll_callback) -_CALLBACK_NOARG_FNPTR = lltype.Ptr(lltype.FuncType([], lltype.Void)) +## @specialize.arg(2) +## def _change_time(mode, time, callback): +## ll_callback = llhelper(_CALLBACK_NOARG_FNPTR, callback) +## llop.revdb_change_time(lltype.Void, mode, time, ll_callback) +## _CALLBACK_NOARG_FNPTR = lltype.Ptr(lltype.FuncType([], lltype.Void)) _CALLBACK_GCREF_FNPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF], lltype.Void)) _CMDPTR = rffi.CStructPtr('rpy_revdb_command_s', diff --git a/rpython/rtyper/lltypesystem/lloperation.py b/rpython/rtyper/lltypesystem/lloperation.py --- a/rpython/rtyper/lltypesystem/lloperation.py +++ b/rpython/rtyper/lltypesystem/lloperation.py @@ -567,7 +567,6 @@ 'revdb_stop_point': LLOp(), 'revdb_send_answer': LLOp(), - 'revdb_change_time': LLOp(), 'revdb_breakpoint': LLOp(), 'revdb_get_value': LLOp(sideeffects=False), 'revdb_get_unique_id': LLOp(sideeffects=False), diff --git a/rpython/translator/revdb/interact.py b/rpython/translator/revdb/interact.py --- a/rpython/translator/revdb/interact.py +++ b/rpython/translator/revdb/interact.py @@ -31,6 +31,7 @@ last_time = self.pgroup.get_current_time() if last_time != previous_time: print + self.pgroup.update_watch_values() if self.print_extra_pending_info: print self.print_extra_pending_info self.print_extra_pending_info = None @@ -117,16 +118,15 @@ else: return '?????point' - def _bp_new(self, break_at, watchvalue=None): + def _bp_new(self, break_at): b = self.pgroup.edit_breakpoints() new = 1 while new in b.num2name: new += 1 b.num2name[new] = break_at - if watchvalue is not None: - b.watchvalues[new] = watchvalue + if break_at.startswith('W'): + b.watchvalues[new] = '' print "%s %d added" % (self._bp_kind(break_at).capitalize(), new) - return new def cmd_info_breakpoints(self): """List current breakpoints and watchpoints""" @@ -288,5 +288,5 @@ print text print 'Watchpoint not added' else: - print 'Current value:', text - self._bp_new('W' + argument, watchvalue=text) + self._bp_new('W' + argument) + self.pgroup.update_watch_values() diff --git a/rpython/translator/revdb/process.py b/rpython/translator/revdb/process.py --- a/rpython/translator/revdb/process.py +++ b/rpython/translator/revdb/process.py @@ -75,7 +75,7 @@ return ''.join(pieces) def send(self, msg): - print 'SENT:', self.pid, msg + #print 'SENT:', self.pid, msg binary = struct.pack("iIqqq", msg.cmd, len(msg.extra), msg.arg1, msg.arg2, msg.arg3) self.control_socket.sendall(binary + msg.extra) @@ -85,7 +85,7 @@ cmd, size, arg1, arg2, arg3 = struct.unpack("iIqqq", binary) extra = self._recv_all(size) msg = Message(cmd, arg1, arg2, arg3, extra) - print 'RECV:', self.pid, msg + #print 'RECV:', self.pid, msg return msg def expect(self, cmd, arg1=0, arg2=0, arg3=0, extra=""): @@ -133,7 +133,7 @@ except socket.error: pass - def forward(self, steps, breakpoint_mode, all_breakpoints): + def forward(self, steps, breakpoint_mode): """Move this subprocess forward in time. Returns the Breakpoint or None. """ @@ -149,8 +149,6 @@ break if bkpt is None: bkpt = Breakpoint(msg.arg1, msg.arg3) - all_breakpoints.watchvalues = dict.fromkeys( - all_breakpoints.watchvalues) # set all values to None assert msg.cmd == ANSWER_READY self.update_times(msg) return bkpt @@ -175,7 +173,7 @@ pgroup.all_printed_objects_lst.append(uid) sys.stdout.write('$%d = ' % nid) else: - print >> sys.stderr, "unexpected message %d" % (msg.cmd,) + print >> sys.stderr, "unexpected %r" % (msg,) class ReplayProcessGroup(object): @@ -268,8 +266,7 @@ break assert rel_next_clone >= 0 if rel_next_clone > 0: - bkpt = self.active.forward(rel_next_clone, breakpoint_mode, - self.all_breakpoints) + bkpt = self.active.forward(rel_next_clone, breakpoint_mode) if breakpoint_mode == 'r': latest_bkpt = bkpt or latest_bkpt elif bkpt: @@ -279,8 +276,7 @@ self.paused[self.active.current_time].close() clone = self.active.clone() self.paused[clone.current_time] = clone - bkpt = self.active.forward(steps, breakpoint_mode, - self.all_breakpoints) + bkpt = self.active.forward(steps, breakpoint_mode) if breakpoint_mode == 'r': bkpt = bkpt or latest_bkpt if bkpt: @@ -349,11 +345,6 @@ name = num2name.get(n, '') if name.startswith('W'): text = watchvalues[n] - if text is None: - _, text = self.check_watchpoint_expr(name[1:]) - print 'updating watchpoint value: %s => %s' % ( - name[1:], text) - watchvalues[n] = text flat.append(text) extra = '\x00'.join(flat) self.active.send(Message(CMD_WATCHVALUES, extra=extra)) @@ -361,6 +352,18 @@ self.active.breakpoints_cache = self.all_breakpoints.duplicate() + def update_watch_values(self): + seen = set() + for num, name in self.all_breakpoints.num2name.items(): + if name.startswith('W'): + _, text = self.check_watchpoint_expr(name[1:]) + if text != self.all_breakpoints.watchvalues[num]: + print 'updating watchpoint value: %s => %s' % ( + name[1:], text) + self.all_breakpoints.watchvalues[num] = text + seen.add(num) + assert set(self.all_breakpoints.watchvalues) == seen + def check_watchpoint_expr(self, expr): self.active.send(Message(CMD_CHECKWATCH, extra=expr)) msg = self.active.expect(ANSWER_WATCH, Ellipsis, extra=Ellipsis) diff --git a/rpython/translator/revdb/src-revdb/revdb.c b/rpython/translator/revdb/src-revdb/revdb.c --- a/rpython/translator/revdb/src-revdb/revdb.c +++ b/rpython/translator/revdb/src-revdb/revdb.c @@ -396,11 +396,18 @@ } } -static void disable_io(rpy_revdb_t *dinfo) +static rpy_revdb_t disabled_state; +static void *disabled_exc[2]; + +static void disable_io(void) { - *dinfo = rpy_revdb; /* save the complete struct */ - dinfo->saved_exc[0] = pypy_g_ExcData.ed_exc_type; - dinfo->saved_exc[1] = pypy_g_ExcData.ed_exc_value; + if (flag_io_disabled) { + fprintf(stderr, "unexpected recursive disable_io()\n"); + exit(1); + } + disabled_state = rpy_revdb; /* save the complete struct */ + disabled_exc[0] = pypy_g_ExcData.ed_exc_type; + disabled_exc[1] = pypy_g_ExcData.ed_exc_value; pypy_g_ExcData.ed_exc_type = NULL; pypy_g_ExcData.ed_exc_value = NULL; rpy_revdb.buf_p = NULL; @@ -408,9 +415,13 @@ flag_io_disabled = 1; } -static void enable_io(rpy_revdb_t *dinfo) +static void enable_io(int restore_breaks) { uint64_t v1, v2; + if (!flag_io_disabled) { + fprintf(stderr, "unexpected enable_io()\n"); + exit(1); + } flag_io_disabled = 0; if (pypy_g_ExcData.ed_exc_type != NULL) { @@ -422,22 +433,23 @@ /* restore the complete struct, with the exception of '*_break' */ v1 = rpy_revdb.stop_point_break; v2 = rpy_revdb.unique_id_break; - rpy_revdb = *dinfo; - rpy_revdb.stop_point_break = v1; - rpy_revdb.unique_id_break = v2; - pypy_g_ExcData.ed_exc_type = dinfo->saved_exc[0]; - pypy_g_ExcData.ed_exc_value = dinfo->saved_exc[1]; + rpy_revdb = disabled_state; + if (!restore_breaks) { + rpy_revdb.stop_point_break = v1; + rpy_revdb.unique_id_break = v2; + } + pypy_g_ExcData.ed_exc_type = disabled_exc[0]; + pypy_g_ExcData.ed_exc_value = disabled_exc[1]; } static void execute_rpy_function(rpy_revdb_command_fn func, rpy_revdb_command_t *cmd, RPyString *extra) { - rpy_revdb_t dinfo; - disable_io(&dinfo); + disable_io(); if (setjmp(jmp_buf_cancel_execution) == 0) func(cmd, extra); - enable_io(&dinfo); + enable_io(0); } static void check_at_end(uint64_t stop_points) @@ -585,13 +597,29 @@ execute_rpy_function(rpy_revdb_commands.rp_funcs[i], cmd, s); } +static void save_state(void) +{ + stopped_time = rpy_revdb.stop_point_seen; + stopped_uid = rpy_revdb.unique_id_seen; + rpy_revdb.unique_id_seen = (-1ULL) << 63; +} + +static void restore_state(void) +{ + rpy_revdb.stop_point_seen = stopped_time; + rpy_revdb.unique_id_seen = stopped_uid; + stopped_time = 0; + stopped_uid = 0; +} + RPY_EXTERN bool_t rpy_reverse_db_save_state(void) { if (stopped_time == 0) { - stopped_time = rpy_revdb.stop_point_seen; - stopped_uid = rpy_revdb.unique_id_seen; - rpy_revdb.unique_id_seen = (-1ULL) << 63; + save_state(); + disable_io(); + rpy_revdb.stop_point_break = 0; + rpy_revdb.unique_id_break = 0; return 1; } else @@ -601,17 +629,15 @@ RPY_EXTERN void rpy_reverse_db_restore_state(void) { - rpy_revdb.stop_point_seen = stopped_time; - rpy_revdb.unique_id_seen = stopped_uid; - stopped_time = 0; - stopped_uid = 0; + enable_io(1); + restore_state(); } RPY_EXTERN void rpy_reverse_db_stop_point(void) { while (rpy_revdb.stop_point_break == rpy_revdb.stop_point_seen) { - rpy_reverse_db_save_state(); + save_state(); breakpoint_mode = 0; if (pending_after_forward) { @@ -621,6 +647,8 @@ } else { rpy_revdb_command_t cmd; + if (((int64_t)stopped_uid) < 0) + attach_gdb(); write_answer(ANSWER_READY, stopped_time, stopped_uid, 0); read_sock(&cmd, sizeof(cmd)); @@ -652,7 +680,7 @@ break; } } - rpy_reverse_db_restore_state(); + restore_state(); } } @@ -677,30 +705,6 @@ } RPY_EXTERN -void rpy_reverse_db_change_time(char mode, long long time, - void callback(void)) -{ - switch (mode) { - - case 'f': /* forward */ - if (time < 0) { - fprintf(stderr, "revdb.go_forward(): negative amount of steps\n"); - exit(1); - } - if (stopped_time == 0) { - fprintf(stderr, "revdb.go_forward(): not from a debug command\n"); - exit(1); - } - rpy_revdb.stop_point_break = stopped_time + time; - pending_after_forward = callback; - break; - - default: - abort(); /* unreachable */ - } -} - -RPY_EXTERN void rpy_reverse_db_breakpoint(int64_t num) { if (stopped_time != 0) { @@ -750,12 +754,12 @@ exit(1); } if (rpy_revdb_commands.rp_alloc) { - rpy_revdb_t dinfo; - rpy_reverse_db_save_state(); - disable_io(&dinfo); + if (!rpy_reverse_db_save_state()) { + fprintf(stderr, "unexpected recursive unique_id_break\n"); + exit(1); + } if (setjmp(jmp_buf_cancel_execution) == 0) rpy_revdb_commands.rp_alloc(uid, new_object); - enable_io(&dinfo); rpy_reverse_db_restore_state(); } rpy_revdb.unique_id_break = *future_next_id++; diff --git a/rpython/translator/revdb/src-revdb/revdb_include.h b/rpython/translator/revdb/src-revdb/revdb_include.h --- a/rpython/translator/revdb/src-revdb/revdb_include.h +++ b/rpython/translator/revdb/src-revdb/revdb_include.h @@ -18,7 +18,6 @@ char *buf_p, *buf_limit; uint64_t stop_point_seen, stop_point_break; uint64_t unique_id_seen, unique_id_break; - void *saved_exc[2]; } rpy_revdb_t; RPY_EXTERN rpy_revdb_t rpy_revdb; @@ -84,9 +83,6 @@ #define OP_REVDB_SEND_ANSWER(cmd, arg1, arg2, arg3, ll_string, r) \ rpy_reverse_db_send_answer(cmd, arg1, arg2, arg3, ll_string) -#define OP_REVDB_CHANGE_TIME(mode, time, callback, r) \ - rpy_reverse_db_change_time(mode, time, callback) - #define OP_REVDB_BREAKPOINT(num, r) \ rpy_reverse_db_breakpoint(num) @@ -115,8 +111,6 @@ RPY_EXTERN void rpy_reverse_db_send_answer(int cmd, int64_t arg1, int64_t arg2, int64_t arg3, RPyString *extra); RPY_EXTERN Signed rpy_reverse_db_identityhash(struct pypy_header0 *obj); -RPY_EXTERN void rpy_reverse_db_change_time(char mode, long long time, - void callback(void)); RPY_EXTERN void rpy_reverse_db_breakpoint(int64_t num); RPY_EXTERN long long rpy_reverse_db_get_value(char value_id); RPY_EXTERN uint64_t rpy_reverse_db_unique_id_break(void *new_object); _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit