From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26442 invoked by alias); 21 Oct 2008 00:21:33 -0000 Received: (qmail 26433 invoked by uid 22791); 21 Oct 2008 00:21:32 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 21 Oct 2008 00:20:57 +0000 Received: (qmail 26890 invoked from network); 21 Oct 2008 00:20:55 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 21 Oct 2008 00:20:55 -0000 From: Pedro Alves To: teawater Subject: Re: [reverse/record] adjust_pc_after_break in reverse execution mode? Date: Tue, 21 Oct 2008 00:21:00 -0000 User-Agent: KMail/1.9.9 Cc: "Michael Snyder" , "gdb-patches@sourceware.org" References: <200810180210.16346.pedro@codesourcery.com> <48FCC413.3040506@vmware.com> In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200810210121.07914.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-10/txt/msg00498.txt.bz2 On Tuesday 21 October 2008 00:36:12, teawater wrote: > I think your mean is check breakpoint in address > read_pc()+gdbarch_decr_pc_after_break (gdbarch) in record_wait, right? Taking x86 as an example, when you're doing normal debugging and you hit a breakpoint (SIGTRAP), the first read_pc GDB does to check where what breakpoint was hit, will read back `breakpoint_PC + 1' --- GDB takes care getting rid of that `+ 1' offset in infrun.c:adjust_pc_after_break. The idea is for you to do the same as the kernel/hardware would --- still check for breakpoints at read_pc, but increment PC by 1 before reporting the breakpoint to GDB's core. E.g., see the `pc += gdbarch...' line from the patch I posted previously, something like: record.c:record_wait () { ... + /* Check for breakpoint hits in forward execution. */ + pc = read_pc (); + if (execution_direction == EXEC_FORWARD + && regular_breakpoint_inserted_here_p (pc) + /* && !single-stepping */) + { + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; + if (software_breakpoint_inserted_here_p (pc)) + { + pc += gdbarch_decr_pc_after_break (gdbarch); + write_pc (pc); + } + -- Pedro Alves