From 1a956d45da618ea50e886ad52deebcdf8408d522 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Mon, 1 Dec 2014 22:23:29 +0100 Subject: [PATCH hurd] xxx crash logging works --- hurd/paths.h | 1 + trans/crash.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 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 5db9974..4966f5c 100644 --- a/trans/crash.c +++ b/trans/crash.c @@ -24,12 +24,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include @@ -142,6 +144,121 @@ 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 + +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); + syslog (LOG_ERR, "%s", msg); + + free (msg); + + return 0; +} kern_return_t S_crash_dump_task (mach_port_t port, @@ -175,6 +292,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