[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