This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] Resubmit process record and replay, 5/10


This is the new version patch.

On Sun, Nov 16, 2008 at 16:21, teawater <teawater@gmail.com> wrote:
> This patch add process record and replay for Linux support file. The
> main function is "record_linux_system_call" will be called by
> architecture record function. It is used to record the system call
> execute log.
>
> 2008-11-16  Hui Zhu  <teawater@gmail.com>
>
>        Process record and replay target.
>
>        * Makefile.in (linux-record.c): New file.
>        * configure.tgt (linux-record.c): New file.
>        * linux-record.c, linux-record.h: New file.
>
>  Makefile.in      |    4
>  b/linux-record.c | 2501 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  b/linux-record.h |  171 +++
>  configure.tgt    |    6
>  4 files changed, 2678 insertions(+), 4 deletions(-)
>
> Following is the diff with the previous patch:
> @@ -1,6 +1,6 @@
>  --- a/configure.tgt
>  +++ b/configure.tgt
> -@@ -185,7 +185,8 @@ i[34567]86-*-solaris*)
> +@@ -185,7 +185,8 @@
>  i[34567]86-*-linux*)
>        # Target: Intel 386 running GNU/Linux
>        gdb_target_obs="i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
> @@ -10,7 +10,7 @@
>        build_gdbserver=yes
>        ;;
>  i[34567]86-*-gnu*)
> -@@ -507,7 +508,8 @@ x86_64-*-linux*)
> +@@ -508,7 +509,8 @@
>        # Target: GNU/Linux x86-64
>        gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
>                        i387-tdep.o i386-linux-tdep.o glibc-tdep.o \
> @@ -20,29 +20,9 @@
>        build_gdbserver=yes
>        ;;
>  x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
> ---- a/Makefile.in
> -+++ b/Makefile.in
> -@@ -515,7 +515,7 @@ ALL_TARGET_OBS = \
> -       xcoffread.o \
> -       prologue-value.o \
> -       symfile-mem.o \
> --      corelow.o
> -+      corelow.o linux-record.o
> -
> - # Host-dependent makefile fragment comes in here.
> - @host_makefile_frag@
> -@@ -1297,7 +1297,7 @@ ALLDEPFILES = \
> -       inf-ptrace.c inf-ttrace.c \
> -       irix5-nat.c \
> -       libunwind-frame.c \
> --      linux-fork.c \
> -+      linux-fork.c linux-record.c \
> -       m68hc11-tdep.c \
> -       m32r-tdep.c \
> -       m32r-linux-nat.c m32r-linux-tdep.c \
> ---- a/linux-record.c
> +--- a//dev/null
>  +++ b/linux-record.c
> -@@ -0,0 +1,2465 @@
> +@@ -0,0 +1,2501 @@
>  +/* Process record and replay target code for GNU/Linux.
>  +
>  +   Copyright (C) 2008 Free Software Foundation, Inc.
> @@ -51,7 +31,7 @@
>  +
>  +   This program is free software; you can redistribute it and/or modify
>  +   it under the terms of the GNU General Public License as published by
> -+   the Free Software Foundation; either version 2 of the License, or
> ++   the Free Software Foundation; either version 3 of the License, or
>  +   (at your option) any later version.
>  +
>  +   This program is distributed in the hope that it will be useful,
> @@ -148,7 +128,7 @@
>  +      target_terminal_ours ();
>  +      q =
>  +        yquery (_
> -+                ("The next instruction is syscall exit.  It will make the
> program exit.  Do you want to stop the program."));
> ++                ("The next instruction is syscall exit.  It will make the
> program exit.  Do you want to stop the program?"));
>  +      target_terminal_inferior ();
>  +      if (q)
>  +        {
> @@ -453,13 +433,13 @@
>  +      else if (tmpu32 == tdep->ioctl_TIOCSERGSTRUCT)
>  +      {
>  +        printf_unfiltered (_
> -+                           ("Record: record and reverse target doesn't support ioctl
> request TIOCSERGSTRUCT\n"));
> ++                           ("Process record and replay target doesn't support ioctl
> request TIOCSERGSTRUCT\n"));
>  +        return (1);
>  +      }
>  +      else
>  +      {
>  +        printf_unfiltered (_
> -+                           ("Record: record and reverse target doesn't support ioctl
> request 0x%08x.\n"),
> ++                           ("Process record and replay target doesn't support ioctl
> request 0x%08x.\n"),
>  +                           tmpu32);
>  +        return (1);
>  +      }
> @@ -616,22 +596,13 @@
>  +      /* old_select */
>  +    case 82:
>  +      {
> -+      /*
> -+         struct sel_arg_struct {
> -+         unsigned long n;
> -+         fd_set *inp;
> -+         fd_set *outp;
> -+         fd_set *exp;
> -+         struct timeval *tvp;
> -+         };
> -+       */
>  +      struct sel_arg_struct
>  +      {
> -+        uint32_t n;
> -+        uint32_t inp;
> -+        uint32_t outp;
> -+        uint32_t exp;
> -+        uint32_t tvp;
> ++        CORE_ADDR n;
> ++        CORE_ADDR inp;
> ++        CORE_ADDR outp;
> ++        CORE_ADDR exp;
> ++        CORE_ADDR tvp;
>  +      } sel;
>  +
>  +      regcache_raw_read (record_regcache, tdep->arg1,
> @@ -640,9 +611,12 @@
>  +        {
>  +          if (target_read_memory (tmpu32, (gdb_byte *) & sel, sizeof (sel)))
>  +            {
> -+              fprintf_unfiltered (gdb_stdlog,
> -+                                  "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                  paddr_nz (tmpu32), sizeof (sel));
> ++              if (record_debug)
> ++                {
> ++                  fprintf_unfiltered (gdb_stdlog,
> ++                                      "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                      paddr_nz (tmpu32), sizeof (sel));
> ++                }
>  +              return (-1);
>  +            }
>  +          if (record_arch_list_add_mem (sel.inp, tdep->size_fd_set))
> @@ -696,7 +670,7 @@
>  +      target_terminal_ours ();
>  +      q =
>  +        yquery (_
> -+                ("The next instruction is syscall reboot.  It will restart the
> computer.  Do you want to stop the program."));
> ++                ("The next instruction is syscall reboot.  It will restart the
> computer.  Do you want to stop the program?"));
>  +      target_terminal_inferior ();
>  +      if (q)
>  +        {
> @@ -730,7 +704,7 @@
>  +      target_terminal_ours ();
>  +      q =
>  +        yquery (_
> -+                ("The next instruction is syscall munmap.  It will free the
> memory addr = 0x%s len = %d.  It will make record target get error.
> Do you want to stop the program."),
> ++                ("The next instruction is syscall munmap.  It will free the
> memory addr = 0x%s len = %d.  It will make record target get error.
> Do you want to stop the program?"),
>  +                paddr_nz (tmpu32), len);
>  +      target_terminal_inferior ();
>  +      if (q)
> @@ -792,9 +766,12 @@
>  +            {
>  +              if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
>  +                {
> -+                  fprintf_unfiltered (gdb_stdlog,
> -+                                      "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                      paddr_nz (tmpu32), sizeof (a));
> ++                  if (record_debug)
> ++                    {
> ++                      fprintf_unfiltered (gdb_stdlog,
> ++                                          "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                          paddr_nz (tmpu32), sizeof (a));
> ++                    }
>  +                  return (-1);
>  +                }
>  +              if (record_arch_list_add_mem (a[1], tdep->size_sockaddr))
> @@ -818,9 +795,12 @@
>  +            {
>  +              if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
>  +                {
> -+                  fprintf_unfiltered (gdb_stdlog,
> -+                                      "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                      paddr_nz (tmpu32), sizeof (a));
> ++                  if (record_debug)
> ++                    {
> ++                      fprintf_unfiltered (gdb_stdlog,
> ++                                          "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                          paddr_nz (tmpu32), sizeof (a));
> ++                    }
>  +                  return (-1);
>  +                }
>  +              if (record_arch_list_add_mem (a[3], tdep->size_int))
> @@ -842,9 +822,12 @@
>  +            {
>  +              if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
>  +                {
> -+                  fprintf_unfiltered (gdb_stdlog,
> -+                                      "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                      paddr_nz (tmpu32), sizeof (a));
> ++                  if (record_debug)
> ++                    {
> ++                      fprintf_unfiltered (gdb_stdlog,
> ++                                          "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                          paddr_nz (tmpu32), sizeof (a));
> ++                    }
>  +                  return (-1);
>  +                }
>  +              if (a[2])
> @@ -852,9 +835,12 @@
>  +                  if (target_read_memory
>  +                      (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
>  +                    {
> -+                      fprintf_unfiltered (gdb_stdlog,
> -+                                          "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                          paddr_nz (a[2]), sizeof (a[2]));
> ++                      if (record_debug)
> ++                        {
> ++                          fprintf_unfiltered (gdb_stdlog,
> ++                                              "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                              paddr_nz (a[2]), sizeof (a[2]));
> ++                        }
>  +                      return (-1);
>  +                    }
>  +                  if (record_arch_list_add_mem (a[1], a[2]))
> @@ -874,9 +860,12 @@
>  +            {
>  +              if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
>  +                {
> -+                  fprintf_unfiltered (gdb_stdlog,
> -+                                      "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                      paddr_nz (tmpu32), sizeof (a));
> ++                  if (record_debug)
> ++                    {
> ++                      fprintf_unfiltered (gdb_stdlog,
> ++                                          "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                          paddr_nz (tmpu32), sizeof (a));
> ++                    }
>  +                  return (-1);
>  +                }
>  +              if (a[2])
> @@ -884,9 +873,13 @@
>  +                  if (target_read_memory
>  +                      (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
>  +                    {
> -+                      fprintf_unfiltered (gdb_stdlog,
> -+                                          "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                          paddr_nz (a[2]), sizeof (a[2]));
> ++                      if (record_debug)
> ++                        {
> ++                          fprintf_unfiltered (gdb_stdlog,
> ++                                              "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                              paddr_nz (a[2]),
> ++                                              sizeof (a[2]));
> ++                        }
>  +                      return (-1);
>  +                    }
>  +                  if (record_arch_list_add_mem (a[1], a[2]))
> @@ -919,9 +912,12 @@
>  +            {
>  +              if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
>  +                {
> -+                  fprintf_unfiltered (gdb_stdlog,
> -+                                      "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                      paddr_nz (tmpu32), sizeof (a));
> ++                  if (record_debug)
> ++                    {
> ++                      fprintf_unfiltered (gdb_stdlog,
> ++                                          "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                          paddr_nz (tmpu32), sizeof (a));
> ++                    }
>  +                  return (-1);
>  +                }
>  +              if (a[4])
> @@ -929,9 +925,12 @@
>  +                  if (target_read_memory
>  +                      (a[4], (gdb_byte *) & av, sizeof (av)))
>  +                    {
> -+                      fprintf_unfiltered (gdb_stdlog,
> -+                                          "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                          paddr_nz (a[4]), sizeof (av));
> ++                      if (record_debug)
> ++                        {
> ++                          fprintf_unfiltered (gdb_stdlog,
> ++                                              "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                              paddr_nz (a[4]), sizeof (av));
> ++                        }
>  +                      return (-1);
>  +                    }
>  +                  if (record_arch_list_add_mem (a[3], av))
> @@ -973,9 +972,12 @@
>  +            {
>  +              if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
>  +                {
> -+                  fprintf_unfiltered (gdb_stdlog,
> -+                                      "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                      paddr_nz (tmpu32), sizeof (a));
> ++                  if (record_debug)
> ++                    {
> ++                      fprintf_unfiltered (gdb_stdlog,
> ++                                          "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                          paddr_nz (tmpu32), sizeof (a));
> ++                    }
>  +                  return (-1);
>  +                }
>  +              if (record_arch_list_add_mem (a[1], tdep->size_msghdr))
> @@ -987,9 +989,13 @@
>  +                  if (target_read_memory
>  +                      (a[1], (gdb_byte *) & rec, sizeof (rec)))
>  +                    {
> -+                      fprintf_unfiltered (gdb_stdlog,
> -+                                          "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                          paddr_nz (a[1]), sizeof (rec));
> ++                      if (record_debug)
> ++                        {
> ++                          fprintf_unfiltered (gdb_stdlog,
> ++                                              "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                              paddr_nz (a[1]),
> ++                                              sizeof (rec));
> ++                        }
>  +                      return (-1);
>  +                    }
>  +                  if (record_arch_list_add_mem
> @@ -1010,10 +1016,14 @@
>  +                              (rec.msg_iov, (gdb_byte *) & iov,
>  +                               sizeof (iov)))
>  +                            {
> -+                              fprintf_unfiltered (gdb_stdlog,
> -+                                                  "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                                  paddr_nz (rec.msg_iov),
> -+                                                  sizeof (iov));
> ++                              if (record_debug)
> ++                                {
> ++                                  fprintf_unfiltered (gdb_stdlog,
> ++                                                      "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                                      paddr_nz (rec.
> ++                                                                msg_iov),
> ++                                                      sizeof (iov));
> ++                                }
>  +                              return (-1);
>  +                            }
>  +                          if (record_arch_list_add_mem
> @@ -1030,7 +1040,7 @@
>  +        break;
>  +      default:
>  +        printf_unfiltered (_
> -+                           ("Record: record and reverse function doesn't support
> socketcall call 0x%08x\n"),
> ++                           ("Process record and replay target doesn't support
> socketcall call 0x%08x\n"),
>  +                           tmpu32);
>  +        return (-1);
>  +        break;
> @@ -1378,10 +1388,13 @@
>  +              if (target_read_memory
>  +                  (vec, (gdb_byte *) & iov, sizeof (struct record_iovec)))
>  +                {
> -+                  fprintf_unfiltered (gdb_stdlog,
> -+                                      "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                      paddr_nz (vec),
> -+                                      sizeof (struct record_iovec));
> ++                  if (record_debug)
> ++                    {
> ++                      fprintf_unfiltered (gdb_stdlog,
> ++                                          "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                          paddr_nz (vec),
> ++                                          sizeof (struct record_iovec));
> ++                    }
>  +                  return (-1);
>  +                }
>  +              if (record_arch_list_add_mem (iov.iov_base, iov.iov_len))
> @@ -2016,9 +2029,12 @@
>  +        if (target_read_memory
>  +            (tmpu32, (gdb_byte *) iocbp, nr * tdep->size_int))
>  +          {
> -+            fprintf_unfiltered (gdb_stdlog,
> -+                                "Record: read memory addr = 0x%s len = %d error.\n",
> -+                                paddr_nz (tmpu32), nr * tdep->size_int);
> ++            if (record_debug)
> ++              {
> ++                fprintf_unfiltered (gdb_stdlog,
> ++                                    "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++                                    paddr_nz (tmpu32), nr * tdep->size_int);
> ++              }
>  +            return (-1);
>  +          }
>  +        for (i = 0; i < nr; i++)
> @@ -2053,7 +2069,7 @@
>  +      target_terminal_ours ();
>  +      q =
>  +        yquery (_
> -+                ("The next instruction is syscall exit_group.  It will make the
> program exit.  Do you want to stop the program."));
> ++                ("The next instruction is syscall exit_group.  It will make the
> program exit.  Do you want to stop the program?"));
>  +      target_terminal_inferior ();
>  +      if (q)
>  +        {
> @@ -2500,7 +2516,7 @@
>  +
>  +    default:
>  +      printf_unfiltered (_
> -+                       ("Record: record and reverse function doesn't support syscall
> number 0x%08x\n"),
> ++                       ("Process record and replay target doesn't support syscall
> number 0x%08x\n"),
>  +                       tmpu32);
>  +      return (-1);
>  +      break;
> @@ -2508,7 +2524,7 @@
>  +
>  +  return (0);
>  +}
> ---- a/linux-record.h
> +--- a//dev/null
>  +++ b/linux-record.h
>  @@ -0,0 +1,171 @@
>  +/* Process record and replay target code for GNU/Linux.
> @@ -2519,7 +2535,7 @@
>  +
>  +   This program is free software; you can redistribute it and/or modify
>  +   it under the terms of the GNU General Public License as published by
> -+   the Free Software Foundation; either version 2 of the License, or
> ++   the Free Software Foundation; either version 3 of the License, or
>  +   (at your option) any later version.
>  +
>  +   This program is distributed in the hope that it will be useful,
> @@ -2535,7 +2551,7 @@
>  +
>  +typedef struct linux_record_tdep_s
>  +{
> -+  /* The size of the type that will be use in system call. */
> ++  /* The size of the type that will be use in system call.  */
>  +  int size__old_kernel_stat;
>  +  int size_tms;
>  +  int size_loff_t;
> @@ -2604,7 +2620,7 @@
>  +  int size_serial_icounter_struct;
>  +  int size_hayes_esp_config;
>  +
> -+  /* the values of the second argument of system call "sys_ioctl". */
> ++  /* the values of the second argument of system call "sys_ioctl".  */
>  +  int ioctl_TCGETS;
>  +  int ioctl_TCSETS;
>  +  int ioctl_TCSETSW;
> @@ -2671,7 +2687,7 @@
>  +  int ioctl_TIOCSHAYESESP;
>  +  int ioctl_FIOQSIZE;
>  +
> -+  /* The number of the registers that use to be the arguments of
> system call. */
> ++  /* The number of the registers that use to be the arguments of
> system call.  */
>  +  int arg1;
>  +  int arg2;
>  +  int arg3;
> @@ -2682,3 +2698,23 @@
>  +extern int record_linux_system_call (int num, linux_record_tdep_t * tdep);
>  +
>  +#endif /* _LINUX_RECORD_H_ */
> +--- a/Makefile.in
> ++++ b/Makefile.in
> +@@ -515,7 +515,7 @@
> +       xcoffread.o \
> +       prologue-value.o \
> +       symfile-mem.o \
> +-      corelow.o
> ++      corelow.o linux-record.o
> +
> + # Host-dependent makefile fragment comes in here.
> + @host_makefile_frag@
> +@@ -1297,7 +1297,7 @@
> +       inf-ptrace.c inf-ttrace.c \
> +       irix5-nat.c \
> +       libunwind-frame.c \
> +-      linux-fork.c \
> ++      linux-fork.c linux-record.c \
>

Attachment: 5-linux-record.txt
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]