[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] coredump.patch



ChangeSet 1.1405, 2005/04/30 09:45:02+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx

        coredump.patch
        Extend libxc and gdb server to coredump a domain.
        Signed-off-by: Kip Macy <kmacy@xxxxxxxxxxx>



 gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in     |    2 
 gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c |   40 -
 gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/server.c        |  639 +++++++++++++++++
 libxc/Makefile                                         |    2 
 libxc/xc.h                                             |   39 +
 libxc/xc_core.c                                        |   99 ++
 libxc/xc_ptrace.c                                      |    9 
 libxc/xc_ptrace_core.c                                 |  287 +++++++
 python/xen/lowlevel/xc/xc.c                            |   35 
 9 files changed, 1131 insertions(+), 21 deletions(-)


diff -Nru a/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in 
b/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in
--- a/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in  2005-04-30 
05:02:45 -04:00
+++ b/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/Makefile.in  2005-04-30 
05:02:45 -04:00
@@ -83,7 +83,7 @@
 # -I. for config files.
 # -I${srcdir} for our headers.
 # -I$(srcdir)/../regformats for regdef.h.
-INCLUDE_CFLAGS = -I. -I${srcdir} -I$(srcdir)/../regformats -I$(INCLUDE_DIR)
+INCLUDE_CFLAGS = -I. -I${srcdir} -I$(srcdir)/../regformats -I$(INCLUDE_DIR)  
-I../../../../libxc/ -I../../../../libxutil/
 
 # M{H,T}_CFLAGS, if defined, has host- and target-dependent CFLAGS
 # from the config/ directory.
diff -Nru a/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c 
b/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
--- a/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c      
2005-04-30 05:02:45 -04:00
+++ b/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c      
2005-04-30 05:02:45 -04:00
@@ -35,12 +35,11 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <errno.h>
-
+#include <xc.h>
 #define TRACE_ENTER /* printf("enter %s\n", __FUNCTION__) */
-#define ptrace xc_ptrace
-long xc_ptrace(enum __ptrace_request request, ...);
+long (*myptrace)(enum __ptrace_request, pid_t, long, long);
+int (*myxcwait)(int domain, int *status, int options) ;
 
-int waitdomain(int domain, int *status, int options);
 
 #define DOMFLAGS_DYING     (1<<0) /* Domain is scheduled to die.             */
 #define DOMFLAGS_CRASHED   (1<<1) /* Crashed domain; frozen for postmortem.  */
@@ -61,6 +60,8 @@
 
 int debug_threads;
 int using_threads;
+extern int isfile;
+
 struct pending_signals
 {
   int signal;
@@ -150,7 +151,7 @@
 {
     struct process_info *new_process;
     current_domain = domain;
-    if (ptrace (PTRACE_ATTACH, domain, 0, 0) != 0) {
+    if (myptrace (PTRACE_ATTACH, domain, 0, 0) != 0) {
        fprintf (stderr, "Cannot attach to domain %d: %s (%d)\n", domain,
                 strerror (errno), errno);
        fflush (stderr);
@@ -173,7 +174,7 @@
 {
   struct thread_info *thread = (struct thread_info *) entry;
   struct process_info *process = get_thread_process (thread);
-  ptrace (PTRACE_KILL, pid_of (process), 0, 0);
+  myptrace (PTRACE_KILL, pid_of (process), 0, 0);
 
 }
 
@@ -190,7 +191,7 @@
   struct thread_info *thread = (struct thread_info *) entry;
   struct process_info *process = get_thread_process (thread);
 
-  ptrace (PTRACE_DETACH, pid_of (process), 0, 0);
+  myptrace (PTRACE_DETACH, pid_of (process), 0, 0);
 }
 
 
@@ -216,8 +217,7 @@
 linux_wait (char *status)
 {
   int w;
-  TRACE_ENTER;
-  if (waitdomain(current_domain, &w, 0))
+  if (myxcwait(current_domain, &w, 0))
       return -1;
   
   if (w & (DOMFLAGS_CRASHED|DOMFLAGS_DYING)) {
@@ -242,7 +242,7 @@
   expect_signal = resume_info->sig;
   for_each_inferior(&all_threads, regcache_invalidate_one);
 
-  ptrace (step ? PTRACE_SINGLESTEP : PTRACE_CONT, current_domain, 0, 0);
+  myptrace (step ? PTRACE_SINGLESTEP : PTRACE_CONT, current_domain, 0, 0);
 
 }
 
@@ -266,7 +266,7 @@
        }
 
       buf = malloc (regset->size);
-      res = ptrace (regset->get_request, inferior_pid, 0, buf);
+      res = myptrace (regset->get_request, inferior_pid, 0, 
(PTRACE_XFER_TYPE)buf);
       if (res < 0)
        {
          if (errno == EIO)
@@ -318,7 +318,7 @@
 
       buf = malloc (regset->size);
       regset->fill_function (buf);
-      res = ptrace (regset->set_request, inferior_pid, 0, buf);
+      res = myptrace (regset->set_request, inferior_pid, 0, 
(PTRACE_XFER_TYPE)buf);
       if (res < 0)
        {
          if (errno == EIO)
@@ -395,7 +395,7 @@
   for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
     {
       errno = 0;
-      buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, (PTRACE_ARG3_TYPE) 
addr, 0);
+      buffer[i] = myptrace (PTRACE_PEEKTEXT, inferior_pid, (PTRACE_ARG3_TYPE) 
addr, 0);
       if (errno)
        return errno;
     }
@@ -428,13 +428,13 @@
 
   /* Fill start and end extra bytes of buffer with existing memory data.  */
 
-  buffer[0] = ptrace (PTRACE_PEEKTEXT, inferior_pid,
+  buffer[0] = myptrace (PTRACE_PEEKTEXT, inferior_pid,
                      (PTRACE_ARG3_TYPE) addr, 0);
 
   if (count > 1)
     {
       buffer[count - 1]
-       = ptrace (PTRACE_PEEKTEXT, inferior_pid,
+       = myptrace (PTRACE_PEEKTEXT, inferior_pid,
                  (PTRACE_ARG3_TYPE) (addr + (count - 1)
                                      * sizeof (PTRACE_XFER_TYPE)),
                  0);
@@ -448,7 +448,7 @@
   for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
     {
       errno = 0;
-      ptrace (PTRACE_POKETEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, 
buffer[i]);
+      myptrace (PTRACE_POKETEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, 
buffer[i]);
       if (errno)
        return errno;
     }
@@ -545,4 +545,12 @@
                       the_low_target.breakpoint_len);
   init_registers ();
   linux_init_signals ();
+  if (isfile) {
+      myptrace = xc_ptrace_core;
+      myxcwait = xc_waitdomain_core;
+  } else {
+      myptrace = xc_ptrace;
+      myxcwait = xc_waitdomain;
+  }
+
 }
diff -Nru a/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/server.c 
b/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/server.c
--- /dev/null   Wed Dec 31 16:00:00 196900
+++ b/tools/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/server.c     2005-04-30 
05:02:45 -04:00
@@ -0,0 +1,639 @@
+/* Main code for remote server for GDB.
+   Copyright 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003, 2004
+   Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include "server.h"
+
+#include <unistd.h>
+#include <signal.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int cont_thread;
+int general_thread;
+int step_thread;
+int thread_from_wait;
+int old_thread_from_wait;
+int extended_protocol;
+int server_waiting;
+int isfile = 0;
+
+jmp_buf toplevel;
+
+/* The PID of the originally created or attached inferior.  Used to
+   send signals to the process when GDB sends us an asynchronous interrupt
+   (user hitting Control-C in the client), and to wait for the child to exit
+   when no longer debugging it.  */
+
+int signal_pid;
+
+static unsigned char
+start_inferior (char *argv[], char *statusptr)
+{
+  signal (SIGTTOU, SIG_DFL);
+  signal (SIGTTIN, SIG_DFL);
+
+  signal_pid = create_inferior (argv[0], argv);
+
+  fprintf (stderr, "Process %s created; pid = %d\n", argv[0],
+          signal_pid);
+
+  signal (SIGTTOU, SIG_IGN);
+  signal (SIGTTIN, SIG_IGN);
+  tcsetpgrp (fileno (stderr), signal_pid);
+
+  /* Wait till we are at 1st instruction in program, return signal number.  */
+  return mywait (statusptr, 0);
+}
+
+static int
+attach_inferior (int pid, char *statusptr, unsigned char *sigptr)
+{
+  /* myattach should return -1 if attaching is unsupported,
+     0 if it succeeded, and call error() otherwise.  */
+
+  if (myattach (pid) != 0)
+    return -1;
+
+  fprintf (stderr, "Attached; pid = %d\n", pid);
+
+  /* FIXME - It may be that we should get the SIGNAL_PID from the
+     attach function, so that it can be the main thread instead of
+     whichever we were told to attach to.  */
+  signal_pid = pid;
+
+  *sigptr = mywait (statusptr, 0);
+
+  return 0;
+}
+
+extern int remote_debug;
+
+/* Handle all of the extended 'q' packets.  */
+void
+handle_query (char *own_buf)
+{
+  static struct inferior_list_entry *thread_ptr;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.