From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5085 invoked by alias); 26 Nov 2009 07:20:29 -0000 Received: (qmail 5072 invoked by uid 22791); 26 Nov 2009 07:20:25 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-px0-f175.google.com (HELO mail-px0-f175.google.com) (209.85.216.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 26 Nov 2009 07:20:20 +0000 Received: by pxi5 with SMTP id 5so354495pxi.12 for ; Wed, 25 Nov 2009 23:20:18 -0800 (PST) MIME-Version: 1.0 Received: by 10.142.55.11 with SMTP id d11mr971554wfa.17.1259220018094; Wed, 25 Nov 2009 23:20:18 -0800 (PST) In-Reply-To: <4B0D8DF3.8090307@vmware.com> References: <4B0D8DF3.8090307@vmware.com> From: Hui Zhu Date: Thu, 26 Nov 2009 07:20:00 -0000 Message-ID: Subject: Re: [RFA/RFC] Prec multi-thread support [2/4] arch support To: Michael Snyder Cc: gdb-patches ml Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable 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-11/txt/msg00568.txt.bz2 On Thu, Nov 26, 2009 at 04:05, Michael Snyder wrote: > Hui Zhu wrote: >> >> 1. In record_linux_system_call gdb_sys_clone, I set record_step to 0. >> Then the record target will let inferior continue until to a >> breakpoint. =A0Most of time, record just let inferior step. =A0But >> sys_clone is very special. =A0It cannot work OK with >> PTRACE_SINGLESTEP.(It make me hang this patch a log of months.) >> >> 2. Add new argument "addr" that point to the next code that need to be >> analyzed to linux syscall record function "record_linux_system_call". > > I'm OK with #2. > I need to spend some time looking at #1. To reproduce this issue: cat 2.c #include #include #include void td1(void * i) { while (1) { printf ("1\n"); sleep (1); } return; } void td2(void * i) { while (1) { printf ("2\n"); sleep (1); } return; } int main(int argc,char *argv[],char *envp[]) { pthread_t t1,t2; pthread_create(&t1, NULL, (void*)td1, NULL); pthread_create(&t2, NULL, (void*)td2, NULL); while (1) { printf ("0\n"); sleep (1); } return (0); } teawater@pek-hzhu:~/gdb$ gcc -lpthread -g 2.c teawater@pek-hzhu:~/gdb$ gdb ./a.out GNU gdb (GDB) 7.0.50.20091126-cvs Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu". For bug reporting instructions, please see: ... Reading symbols from /home/teawater/gdb/a.out...done. (gdb) start Temporary breakpoint 1 at 0x8048495: file 2.c, line 32. Starting program: /home/teawater/gdb/a.out [Thread debugging using libthread_db enabled] Temporary breakpoint 1, main (argc=3D, argv=3D, envp=3D) at 2.c:32 32 pthread_create(&t1, NULL, (void*)td1, NULL); (gdb) b clone Breakpoint 2 at 0xb7f2ae00 (gdb) c Continuing. Breakpoint 2, 0xb7f2ae00 in clone () from /lib/tls/i686/cmov/libc.so.6 (gdb) disas Dump of assembler code for function clone: =3D> 0xb7f2ae00 <+0>: mov $0xffffffea,%eax 0xb7f2ae05 <+5>: mov 0x4(%esp),%ecx 0xb7f2ae09 <+9>: jecxz 0xb7f2ae78 0xb7f2ae0b <+11>: mov 0x8(%esp),%ecx 0xb7f2ae0f <+15>: jecxz 0xb7f2ae78 0xb7f2ae11 <+17>: and $0xfffffff0,%ecx 0xb7f2ae14 <+20>: sub $0x1c,%ecx 0xb7f2ae17 <+23>: mov 0x10(%esp),%eax 0xb7f2ae1b <+27>: mov %eax,0xc(%ecx) 0xb7f2ae1e <+30>: mov 0x4(%esp),%eax 0xb7f2ae22 <+34>: mov %eax,0x8(%ecx) 0xb7f2ae25 <+37>: movl $0x0,0x4(%ecx) 0xb7f2ae2c <+44>: push %ebx 0xb7f2ae2d <+45>: push %esi 0xb7f2ae2e <+46>: push %edi 0xb7f2ae2f <+47>: mov 0x24(%esp),%esi 0xb7f2ae33 <+51>: mov 0x20(%esp),%edx 0xb7f2ae37 <+55>: mov 0x18(%esp),%ebx 0xb7f2ae3b <+59>: mov 0x28(%esp),%edi 0xb7f2ae3f <+63>: mov $0x78,%eax 0xb7f2ae44 <+68>: mov %ebx,(%ecx) 0xb7f2ae46 <+70>: int $0x80 0xb7f2ae48 <+72>: pop %edi 0xb7f2ae49 <+73>: pop %esi 0xb7f2ae4a <+74>: pop %ebx 0xb7f2ae4b <+75>: test %eax,%eax 0xb7f2ae4d <+77>: jl 0xb7f2ae78 0xb7f2ae4f <+79>: je 0xb7f2ae52 ---Type to continue, or q to quit---q Quit (gdb) b *0xb7f2ae46 Breakpoint 3 at 0xb7f2ae46 (gdb) c Continuing. Breakpoint 3, 0xb7f2ae46 in clone () from /lib/tls/i686/cmov/libc.so.6 (gdb) dis (gdb) si Program terminated with signal SIGTRAP, Trace/breakpoint trap. The program no longer exists. > But there's another change in here that you didn't mention -- > you added "if (record_debug) around some warnings. > > Would =A0you take that change out, please, and submit it separately? > It isn't really a part of adding multi-thread support, since this > warning shows up frequently in single-thread prec debugging. > Without this change, when debug the multi-thread inferior, gdb will output a lot of warning like a big rain. :( And it looks didn't affect revere debug. I will post a separate patch for it. Thanks, Hui > >> >> 2009-11-25 =A0Hui Zhu =A0 >> >> =A0 =A0 =A0 =A0* amd64-linux-tdep.c (amd64_linux_syscall_record): Add new >> =A0 =A0 =A0 =A0argument "addr". >> =A0 =A0 =A0 =A0* i386-linux-tdep.c (i386_linux_intx80_sysenter_record): = Ditto. >> =A0 =A0 =A0 =A0* i386-tdep.c (i386_record_lea_modrm): Add "if (record_de= bug)" >> =A0 =A0 =A0 =A0to segment register warning. >> =A0 =A0 =A0 =A0(i386_process_record): Ditto. =A0Add new argument "addr" = when >> =A0 =A0 =A0 =A0call i386_intx80_record, i386_sysenter_record and >> =A0 =A0 =A0 =A0i386_syscall_record. >> =A0 =A0 =A0 =A0* i386-tdep.h (gdbarch_tdep): Add new argument "addr" when >> =A0 =A0 =A0 =A0call i386_intx80_record, i386_sysenter_record and >> =A0 =A0 =A0 =A0i386_syscall_record. >> =A0 =A0 =A0 =A0* linux-record.c (inferior.h): New include. >> =A0 =A0 =A0 =A0(record_linux_system_call): Add new argument "addr". >> =A0 =A0 =A0 =A0Update code for gdb_sys_clone. >> =A0 =A0 =A0 =A0* linux-record.h (record_linux_system_call): Add new argu= ment >> =A0 =A0 =A0 =A0"addr". >> >> --- >> =A0amd64-linux-tdep.c | =A0 =A04 ++-- >> =A0i386-linux-tdep.c =A0| =A0 =A04 ++-- >> =A0i386-tdep.c =A0 =A0 =A0 =A0| =A0 52 >> +++++++++++++++++++++++++++++----------------------- >> =A0i386-tdep.h =A0 =A0 =A0 =A0| =A0 =A06 +++--- >> =A0linux-record.c =A0 =A0 | =A0 13 +++++++++---- >> =A0linux-record.h =A0 =A0 | =A0 =A02 +- >> =A06 files changed, 46 insertions(+), 35 deletions(-) >> >> --- a/amd64-linux-tdep.c >> +++ b/amd64-linux-tdep.c >> @@ -1155,7 +1155,7 @@ static struct linux_record_tdep amd64_li >> =A0#define RECORD_ARCH_GET_GS =A0 =A0 0x1004 >> >> =A0static int >> -amd64_linux_syscall_record (struct regcache *regcache) >> +amd64_linux_syscall_record (struct regcache *regcache, CORE_ADDR addr) >> =A0{ >> =A0 int ret; >> =A0 ULONGEST syscall_native; >> @@ -1205,7 +1205,7 @@ amd64_linux_syscall_record (struct regca >> =A0 =A0 } >> =A0 else >> =A0 =A0 { >> - =A0 =A0 =A0ret =3D record_linux_system_call (syscall_gdb, regcache, >> + =A0 =A0 =A0ret =3D record_linux_system_call (syscall_gdb, addr, regcac= he, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 &amd64_linux_record_tdep); >> =A0 =A0 =A0 if (ret) >> =A0 =A0 =A0 =A0 return ret; >> --- a/i386-linux-tdep.c >> +++ b/i386-linux-tdep.c >> @@ -411,7 +411,7 @@ i386_canonicalize_syscall (int syscall) >> =A0static struct linux_record_tdep i386_linux_record_tdep; >> >> =A0static int >> -i386_linux_intx80_sysenter_record (struct regcache *regcache) >> +i386_linux_intx80_sysenter_record (struct regcache *regcache, CORE_ADDR >> addr) >> =A0{ >> =A0 int ret; >> =A0 LONGEST syscall_native; >> @@ -437,7 +437,7 @@ i386_linux_intx80_sysenter_record (struc >> =A0 =A0 =A0return 0; >> =A0 =A0} >> >> - =A0ret =3D record_linux_system_call (syscall_gdb, regcache, >> + =A0ret =3D record_linux_system_call (syscall_gdb, addr, regcache, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&i386= _linux_record_tdep); >> =A0 if (ret) >> =A0 =A0 return ret; >> --- a/i386-tdep.c >> +++ b/i386-tdep.c >> @@ -3160,10 +3160,11 @@ i386_record_lea_modrm (struct i386_recor >> >> =A0 if (irp->override >=3D 0) >> =A0 =A0 { >> - =A0 =A0 =A0warning (_("Process record ignores the memory change " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "of instruction at address %s because = it " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "can't get the value of the segment re= gister."), >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddress (gdbarch, irp->orig_addr)); >> + =A0 =A0 =A0if (record_debug) >> + =A0 =A0 =A0 =A0warning (_("Process record ignores the memory change " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "of instruction at address %s beca= use it " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "can't get the value of the segmen= t register."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddress (gdbarch, irp->orig_addr)); >> =A0 =A0 =A0 return 0; >> =A0 =A0 } >> >> @@ -4042,11 +4043,12 @@ reswitch: >> =A0 =A0 case 0xa3: >> =A0 =A0 =A0 if (ir.override >=3D 0) >> =A0 =A0 =A0 =A0 { >> - =A0 =A0 =A0 =A0 warning (_("Process record ignores the memory change " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "of instruction at address %s = because " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "it can't get the value of the= segment " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "register."), >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddress (gdbarch, ir.orig_addr)); >> + =A0 =A0 =A0 =A0 =A0if (record_debug) >> + =A0 =A0 =A0 =A0 =A0 warning (_("Process record ignores the memory chan= ge " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "of instruction at address= %s because " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "it can't get the value of= the segment " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "register."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddress (gdbarch, ir.orig_add= r)); >> =A0 =A0 =A0 =A0} >> =A0 =A0 =A0 else >> =A0 =A0 =A0 =A0{ >> @@ -4467,11 +4469,12 @@ reswitch: >> =A0 =A0 =A0 =A0 =A0 if (ir.aflag && (es !=3D ds)) >> =A0 =A0 =A0 =A0 =A0 =A0 { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* addr +=3D ((uint32_t) read_register (I386= _ES_REGNUM)) << 4; >> */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0warning (_("Process record ignores the memo= ry " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "change of instruction= at address %s " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "because it can't get = the value of the " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "ES segment register."= ), >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddress (gdbarch, ir.orig= _addr)); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0if (record_debug) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0warning (_("Process record ignores the = memory " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "change of instruc= tion at address %s " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "because it can't = get the value of the " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "ES segment regist= er."), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddress (gdbarch, ir.= orig_addr)); >> =A0 =A0 =A0 =A0 =A0 =A0 } >> =A0 =A0 =A0 =A0 =A0 else >> =A0 =A0 =A0 =A0 =A0 =A0 { >> @@ -4872,7 +4875,7 @@ reswitch: >> =A0 =A0 =A0 =A0 =A0 =A0ir.addr -=3D 2; >> =A0 =A0 =A0 =A0 =A0 =A0goto no_support; >> =A0 =A0 =A0 =A0 =A0} >> - =A0 =A0 =A0 ret =3D gdbarch_tdep (gdbarch)->i386_intx80_record (ir.reg= cache); >> + =A0 =A0 =A0 ret =3D gdbarch_tdep (gdbarch)->i386_intx80_record (ir.reg= cache, >> ir.addr); >> =A0 =A0 =A0 =A0if (ret) >> =A0 =A0 =A0 =A0 =A0return ret; >> =A0 =A0 =A0 } >> @@ -4974,7 +4977,8 @@ reswitch: >> =A0 =A0 =A0 =A0 =A0 =A0ir.addr -=3D 2; >> =A0 =A0 =A0 =A0 =A0 =A0goto no_support; >> =A0 =A0 =A0 =A0 =A0} >> - =A0 =A0 =A0 ret =3D gdbarch_tdep (gdbarch)->i386_sysenter_record (ir.r= egcache); >> + =A0 =A0 =A0 ret =3D gdbarch_tdep (gdbarch)->i386_sysenter_record (ir.r= egcache, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ir.addr); >> =A0 =A0 =A0 =A0if (ret) >> =A0 =A0 =A0 =A0 =A0return ret; >> =A0 =A0 =A0 } >> @@ -4999,7 +5003,8 @@ reswitch: >> =A0 =A0 =A0 =A0 =A0 =A0ir.addr -=3D 2; >> =A0 =A0 =A0 =A0 =A0 =A0goto no_support; >> =A0 =A0 =A0 =A0 =A0} >> - =A0 =A0 =A0 ret =3D gdbarch_tdep (gdbarch)->i386_syscall_record (ir.re= gcache); >> + =A0 =A0 =A0 ret =3D gdbarch_tdep (gdbarch)->i386_syscall_record (ir.re= gcache, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ir.addr); >> =A0 =A0 =A0 =A0if (ret) >> =A0 =A0 =A0 =A0 =A0return ret; >> =A0 =A0 =A0 } >> @@ -5135,12 +5140,13 @@ reswitch: >> =A0 =A0 =A0 =A0 =A0 =A0 =A0/* sidt */ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0if (ir.override >=3D 0) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0{ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 warning (_("Process record ignores the= memory " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "change of ins= truction at " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "address %s be= cause it can't get " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "the value of = the segment " >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "register."), >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddress (gdbarch,= ir.orig_addr)); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (record_debug) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 warning (_("Process record ignores= the memory " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "change of= instruction at " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "address %= s because it can't get " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "the value= of the segment " >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "register.= "), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 paddress (gdba= rch, ir.orig_addr)); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} >> =A0 =A0 =A0 =A0 =A0 =A0 =A0else >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0{ >> --- a/i386-tdep.h >> +++ b/i386-tdep.h >> @@ -115,11 +115,11 @@ struct gdbarch_tdep >> =A0 =A0 =A0in GDB is not same as I386 instructions. =A0*/ >> =A0 const int *record_regmap; >> =A0 /* Parse intx80 args. =A0*/ >> - =A0int (*i386_intx80_record) (struct regcache *regcache); >> + =A0int (*i386_intx80_record) (struct regcache *regcache, CORE_ADDR add= r); >> =A0 /* Parse sysenter args. =A0*/ >> - =A0int (*i386_sysenter_record) (struct regcache *regcache); >> + =A0int (*i386_sysenter_record) (struct regcache *regcache, CORE_ADDR >> addr); >> =A0 /* Parse syscall args. =A0*/ >> - =A0int (*i386_syscall_record) (struct regcache *regcache); >> + =A0int (*i386_syscall_record) (struct regcache *regcache, CORE_ADDR ad= dr); >> =A0}; >> >> =A0/* Floating-point registers. =A0*/ >> --- a/linux-record.c >> +++ b/linux-record.c >> @@ -21,6 +21,7 @@ >> =A0#include "target.h" >> =A0#include "gdbtypes.h" >> =A0#include "regcache.h" >> +#include "inferior.h" >> =A0#include "record.h" >> =A0#include "linux-record.h" >> >> @@ -222,7 +223,7 @@ record_linux_msghdr (struct regcache *re >> =A0 =A0Return -1 if something wrong. =A0*/ >> >> =A0int >> -record_linux_system_call (enum gdb_syscall syscall, >> +record_linux_system_call (enum gdb_syscall syscall, CORE_ADDR addr, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct regcache *regc= ache, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct linux_record_= tdep *tdep) >> =A0{ >> @@ -242,8 +243,9 @@ record_linux_system_call (enum gdb_sysca >> =A0 =A0 =A0 =A0 int q; >> =A0 =A0 =A0 =A0 target_terminal_ours (); >> =A0 =A0 =A0 =A0 q =3D yquery (_("The next instruction is syscall exit. = =A0" >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"It will make the program e= xit. =A0" >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"Do you want to stop the pr= ogram?")); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"It will make the thread %s= exit. =A0" >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"Do you want to stop the pr= ogram?"), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0target_pid_to_str (inferior_pti= d)); >> =A0 =A0 =A0 =A0 target_terminal_inferior (); >> =A0 =A0 =A0 =A0 if (q) >> =A0 =A0 =A0 =A0 =A0 return 1; >> @@ -1209,10 +1211,13 @@ record_linux_system_call (enum gdb_sysca >> >> =A0 =A0 case gdb_sys_fsync: >> =A0 =A0 case gdb_sys_sigreturn: >> - =A0 =A0case gdb_sys_clone: >> =A0 =A0 case gdb_sys_setdomainname: >> =A0 =A0 =A0 break; >> >> + =A0 =A0case gdb_sys_clone: >> + =A0 =A0 =A0record_step =3D 0; >> + =A0 =A0 =A0break; >> + >> =A0 =A0 case gdb_sys_newuname: >> =A0 =A0 =A0 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulonge= st); >> =A0 =A0 =A0 if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, >> --- a/linux-record.h >> +++ b/linux-record.h >> @@ -534,7 +534,7 @@ enum gdb_syscall { >> >> =A0/* Record a linux syscall. =A0*/ >> >> -extern int record_linux_system_call (enum gdb_syscall num, >> +extern int record_linux_system_call (enum gdb_syscall num, CORE_ADDR >> addr, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = struct regcache *regcache, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = struct linux_record_tdep *tdep); >> =A0#endif /* _LINUX_RECORD_H_ */ > >