bug-hurd
[Top][All Lists]
Advanced

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

[PATCH hurd] xxx crash logging works


From: Justus Winter
Subject: [PATCH hurd] xxx crash logging works
Date: Mon, 22 Feb 2016 20:48:01 +0100

From: Justus Winter <4winter@informatik.uni-hamburg.de>

---
 hurd/paths.h  |   1 +
 trans/crash.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 117 insertions(+)

diff --git a/hurd/paths.h b/hurd/paths.h
index a13ba9b..c6cb7a0 100644
--- a/hurd/paths.h
+++ b/hurd/paths.h
@@ -54,6 +54,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 
02139, USA.  */
 #define        _HURD_IFSOCK    _HURD "ifsock" /* S_IFSOCK */
 
 /* Symbolic names for all non-essential translators.  */
+#define _HURD_CRASH    _HURD "crash"
 #define _HURD_MTAB     _HURD "mtab"
 
 #endif /* hurd/paths.h */
diff --git a/trans/crash.c b/trans/crash.c
index 9279bab..20b0034 100644
--- a/trans/crash.c
+++ b/trans/crash.c
@@ -24,6 +24,7 @@
 #include <hurd.h>
 #include <fcntl.h>
 #include <hurd/trivfs.h>
+#include <hurd/paths.h>
 #include <sys/wait.h>
 #include <error.h>
 #include <argp.h>
@@ -141,6 +142,119 @@ stop_pgrp (process_t userproc, mach_port_t cttyid)
     munmap (pids, numpids);
 }
 
+void mach_print(const char *);
+
+#ifndef EXTERNAL_MACH_PRINT
+asm (".global mach_print;"
+     " mach_print:;"
+     " mov $0xffffffe2, %eax;"
+     " lcall $0x7, $0x0;"
+     " ret;");
+#endif /* EXTERNAL_MACH_PRINT */
+
+#include <mach/thread_status.h>
+
+error_t
+get_pcs (task_t task, char **pcs)
+{
+  error_t err;
+  thread_t *threads;
+  size_t i, nthreads;
+
+#ifdef i386_THREAD_STATE
+  struct i386_thread_state state;
+  mach_msg_type_number_t count = i386_THREAD_STATE_COUNT;
+  int flavor = i386_THREAD_STATE;
+
+  err = task_threads (task, &threads, &nthreads);
+  if (err)
+    return err;
+
+  *pcs = NULL;
+  for (i = 0; i < nthreads; i++)
+    {
+      char *old = *pcs;
+      err = thread_get_state (threads[i], flavor,
+                             (thread_state_t) &state, &count);
+      if (err)
+       return err;
+
+      if (old)
+       asprintf (pcs, "%s, 0x%x", old, state.eip);
+      else
+       asprintf (pcs, "0x%x", state.eip);
+
+      free (old);
+      err = mach_port_deallocate (mach_task_self (), threads[i]);
+      assert_perror (err);
+    }
+#else
+  *pcs = strdup ("architecture not supported");
+#endif
+  return 0;
+}
+
+error_t
+log_crash (task_t task,
+          int signo, integer_t sigcode, int sigerror,
+          natural_t exc, natural_t code, natural_t subcode,
+          enum crash_action how)
+{
+  error_t err;
+  pid_t pid;
+  char argz_buf[128], *argz = argz_buf;
+  size_t argz_len = sizeof argz;
+  char *msg;
+  char *how_msg;
+  char *pcs;
+
+  switch (how)
+    {
+    case crash_suspend:
+      how_msg = "suspending task";
+      break;
+    case crash_kill:
+      how_msg = "killing task";
+      break;
+    case crash_corefile:
+      how_msg = "writing core file";
+      break;
+    default:
+      assert (! "reached");
+    }
+
+  err = proc_task2pid (procserver, task, &pid);
+  if (err)
+    return err;
+
+  err = proc_getprocargs (procserver, pid, &argz, &argz_len);
+  if (err)
+    return err;
+
+  err = get_pcs (task, &pcs);
+  if (err)
+    return err;
+
+  argz_stringify (argz, argz_len, ' ');
+  asprintf (&msg, "%s: %s(%d) crashed, signal {no:%d, code:%d, error:%d}, "
+           "exception {%d, code:%d, subcode:%d}, PCs: {%s}, %s.\n",
+           _HURD_CRASH, argz, pid,
+           signo, sigcode, sigerror,
+           exc, code, subcode,
+           pcs,
+           how_msg);
+  if (argz != argz_buf)
+    vm_deallocate (mach_task_self (), argz, argz_len);
+  free (pcs);
+  if (! msg)
+    return ENOMEM;
+
+  fprintf (stderr, "%s", msg);
+  mach_print (msg);
+  free (msg);
+
+  return 0;
+}
 
 kern_return_t
 S_crash_dump_task (mach_port_t port,
@@ -174,6 +288,8 @@ S_crash_dump_task (mach_port_t port,
        }
     }
 
+  log_crash (task, signo, sigcode, sigerror, exc, code, subcode, how);
+
   switch (how)
     {
     default:                   /* NOTREACHED */
-- 
2.1.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]