0.8.16.9:
[sbcl.git] / src / runtime / interr.c
index b8a863f..60e9d11 100644 (file)
 
 #include <stdio.h>
 #include <stdarg.h>
+#include <stdlib.h>
 
+#include "sbcl.h"
 #include "arch.h"
 #include "signal.h"
 
 #include "runtime.h"
-#include "sbcl.h"
 #include "interr.h"
 #include "print.h"
 #include "lispregs.h"
+#include "genesis/static-symbols.h"
+#include "genesis/vector.h"
+#include "thread.h"
 \f
 /* the way that we shut down the system on a fatal error */
 
@@ -43,7 +47,16 @@ never_returns
 lose(char *fmt, ...)
 {
     va_list ap;
-    fprintf(stderr, "fatal error encountered in SBCL runtime system");
+    fprintf(stderr, "fatal error encountered in SBCL pid %d",getpid());
+    /* freeze all the other threads, so we have a chance of debugging them 
+     */
+    if(all_threads) {
+       struct thread *th1,*th=arch_os_get_current_thread();
+       for_each_thread(th1) {
+           if(th1!=th) kill(th1->pid,SIGSTOP);
+       }
+    }
+
     if (fmt) {
        fprintf(stderr, ":\n");
        va_start(ap, fmt);
@@ -99,9 +112,9 @@ describe_internal_error(os_context_t *context)
            brief_print(*os_context_register_addr(context, offset));
            break;
 
-       case sc_BaseCharReg:
+       case sc_CharacterReg:
            ch = *os_context_register_addr(context, offset);
-#ifdef __i386__
+#ifdef LISP_FEATURE_X86
            if (offset&1)
                ch = ch>>8;
            ch = ch & 0xff;
@@ -123,13 +136,13 @@ describe_internal_error(os_context_t *context)
 #ifdef sc_WordPointerReg
        case sc_WordPointerReg:
 #endif
-           printf("\t0x%08x\n", *os_context_register_addr(context, offset));
+           printf("\t0x%08lx\n", *os_context_register_addr(context, offset));
            break;
        case sc_SignedReg:
-           printf("\t%d\n", *os_context_register_addr(context, offset));
+           printf("\t%ld\n", *os_context_register_addr(context, offset));
            break;
        case sc_UnsignedReg:
-           printf("\t%u\n", *os_context_register_addr(context, offset));
+           printf("\t%lu\n", *os_context_register_addr(context, offset));
            break;
 #ifdef sc_SingleFloatReg
        case sc_SingleFloatReg:
@@ -160,7 +173,7 @@ lispobj debug_print(lispobj string)
        that %primitive print is used (it's only a debugging aid anyway)
        we just put guarantee our safety by putting an unused buffer on
        the stack before doing anything else here */
-    char untouched[32];
+    char untouched[32]; /* GCC warns about not using this, but that's the point.. */
     fprintf(stderr, "%s\n", 
            (char *)(((struct vector *)native_pointer(string))->data),untouched);
     return NIL;