From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5498 invoked by alias); 10 Aug 2009 21:59:15 -0000 Received: (qmail 5489 invoked by uid 22791); 10 Aug 2009 21:59:14 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from smtp-outbound-2.vmware.com (HELO smtp-outbound-2.vmware.com) (65.115.85.73) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 10 Aug 2009 21:59:06 +0000 Received: from jupiter.vmware.com (mailhost5.vmware.com [10.16.68.131]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id AE1294C005; Mon, 10 Aug 2009 14:59:04 -0700 (PDT) Received: from [10.20.94.141] (msnyder-server.eng.vmware.com [10.20.94.141]) by jupiter.vmware.com (Postfix) with ESMTP id A0FD2DC060; Mon, 10 Aug 2009 14:59:04 -0700 (PDT) Message-ID: <4A8097B4.2080709@vmware.com> Date: Mon, 10 Aug 2009 22:12:00 -0000 From: Michael Snyder User-Agent: Thunderbird 1.5.0.12 (X11/20080411) MIME-Version: 1.0 To: Hui Zhu CC: gdb-patches ml Subject: Re: Bug in i386_process_record? References: <4A7BA1DE.6010103@vmware.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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: 2009-08/txt/msg00155.txt.bz2 Yes, this seems to be better. It records only 4 bytes each time it is called. But there seems to be still an off-by-one error? With the test program that I provided, we call memset with an argument of 1024, but we actually record 1025 bytes... this code gets hit 257 times, with the last time recording only 1 byte. Hui Zhu wrote: > On Fri, Aug 7, 2009 at 11:39, Michael Snyder wrote: >> Hi Hui, >> >> While experimenting with your dump/load commands, I think I discovered >> a bug in i386_process_record, in the handling of the "string ops" >> and the "rep" prefix. Looks like we are saving the same data over >> and over in the log. >> >> This was made using the attached sample program. >> >> (gdb) break main >> Breakpoint 1 at 0x80483c4: file memrange-reverse.c, line 29. >> (gdb) run >> Starting program: >> Breakpoint 1, main () >> 29 memset (blob1, 'a', sizeof (blob1)); >> (gdb) record >> (gdb) next >> 30 blob1[sizeof (blob1) - 1] = '\0'; >> (gdb) record dump >> Saving recording to file 'rec.27255' >> Writing 4-byte magic cookie RECORD_FILE_MAGIC (0x26070920) >> [...] >> Writing register 7 val 0x0000000008049684 (1 plus 8 plus 16 bytes) >> Writing memory 0x08049680 (1 plus 8 plus 8 bytes plus 1024 bytes) >> Writing register 1 val 0x00000000000000ff (1 plus 8 plus 16 bytes) >> Writing register 8 val 0x0000000000587be7 (1 plus 8 plus 16 bytes) >> Writing record_end (1 byte) >> Writing register 7 val 0x0000000008049688 (1 plus 8 plus 16 bytes) >> Writing memory 0x08049684 (1 plus 8 plus 8 bytes plus 1020 bytes) >> Writing register 1 val 0x00000000000000fe (1 plus 8 plus 16 bytes) >> Writing register 8 val 0x0000000000587be7 (1 plus 8 plus 16 bytes) >> Writing record_end (1 byte) >> Writing register 7 val 0x000000000804968c (1 plus 8 plus 16 bytes) >> Writing memory 0x08049688 (1 plus 8 plus 8 bytes plus 1016 bytes) >> Writing register 1 val 0x00000000000000fd (1 plus 8 plus 16 bytes) >> Writing register 8 val 0x0000000000587be7 (1 plus 8 plus 16 bytes) >> Writing record_end (1 byte) >> Writing register 7 val 0x0000000008049690 (1 plus 8 plus 16 bytes) >> Writing memory 0x0804968c (1 plus 8 plus 8 bytes plus 1012 bytes) >> Writing register 1 val 0x00000000000000fc (1 plus 8 plus 16 bytes) >> Writing register 8 val 0x0000000000587be7 (1 plus 8 plus 16 bytes) >> Writing record_end (1 byte) >> Writing register 7 val 0x0000000008049694 (1 plus 8 plus 16 bytes) >> Writing memory 0x08049690 (1 plus 8 plus 8 bytes plus 1008 bytes) >> Writing register 1 val 0x00000000000000fb (1 plus 8 plus 16 bytes) >> Writing register 8 val 0x0000000000587be7 (1 plus 8 plus 16 bytes) >> Writing record_end (1 byte) >> Writing register 7 val 0x0000000008049698 (1 plus 8 plus 16 bytes) >> Writing memory 0x08049694 (1 plus 8 plus 8 bytes plus 1004 bytes) >> Writing register 1 val 0x00000000000000fa (1 plus 8 plus 16 bytes) >> Writing register 8 val 0x0000000000587be7 (1 plus 8 plus 16 bytes) >> Writing record_end (1 byte) >> Writing register 7 val 0x000000000804969c (1 plus 8 plus 16 bytes) >> Writing memory 0x08049698 (1 plus 8 plus 8 bytes plus 1000 bytes) >> Writing register 1 val 0x00000000000000f9 (1 plus 8 plus 16 bytes) >> Writing register 8 val 0x0000000000587be7 (1 plus 8 plus 16 bytes) >> Writing record_end (1 byte) >> Writing register 7 val 0x00000000080496a0 (1 plus 8 plus 16 bytes) >> Writing memory 0x0804969c (1 plus 8 plus 8 bytes plus 996 bytes) >> Writing register 1 val 0x00000000000000f8 (1 plus 8 plus 16 bytes) >> Writing register 8 val 0x0000000000587be7 (1 plus 8 plus 16 bytes) >> [...] >> >> Altogether there were 256 duplicate entries, each one is >> four bytes shorter than the previous one. >> >> > > Hi Michael, > > I reproduce about issue. This is because "i386_process_record" record > rep string insn is not right. > I make a patch for it. > > Please help me review it. > > Thanks, > Hui > > 2009-08-10 Hui Zhu > > * record.c (i386_process_record): Remove some error code. > > --- > i386-tdep.c | 27 ++++----------------------- > 1 file changed, 4 insertions(+), 23 deletions(-) > > --- a/i386-tdep.c > +++ b/i386-tdep.c > @@ -4448,9 +4448,8 @@ reswitch: > regcache_raw_read_unsigned (ir.regcache, > ir.regmap[X86_RECORD_REDI_REGNUM], > &tmpulongest); > - if (!ir.aflag) > + if (ir.aflag) > { > - tmpulongest &= 0xffff; > /* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4; */ > if (record_debug) > printf_unfiltered (_("Process record ignores the memory change " > @@ -4460,27 +4459,9 @@ reswitch: > paddress (gdbarch, ir.addr)); > } > if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) > - { > - ULONGEST count, eflags; > - regcache_raw_read_unsigned (ir.regcache, > - ir.regmap[X86_RECORD_REDI_REGNUM], > - &count); > - if (!ir.aflag) > - count &= 0xffff; > - regcache_raw_read_unsigned (ir.regcache, > - ir.regmap[X86_RECORD_EFLAGS_REGNUM], > - &eflags); > - if ((eflags >> 10) & 0x1) > - tmpulongest -= (count - 1) * (1 << ir.ot); > - if (record_arch_list_add_mem (tmpulongest, count * (1 << ir.ot))) > - return -1; > - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); > - } > - else > - { > - if (record_arch_list_add_mem (tmpulongest, 1 << ir.ot)) > - return -1; > - } > + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); > + if (record_arch_list_add_mem (tmpulongest, 1 << ir.ot)) > + return -1; > if (opcode == 0xa4 || opcode == 0xa5) > I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM); > I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);