X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Finterr.c;h=889d64466d7e5227da777ebe8046d6cc7ec98481;hb=c8617f57d0413beb2890e94dabe227cef9c5ddad;hp=c13be451c9270b6c3bb74f64aa21e1947e9526e2;hpb=d1873cc3f7a09f9891bb9c05f206af1774876c0c;p=sbcl.git diff --git a/src/runtime/interr.c b/src/runtime/interr.c index c13be45..889d644 100644 --- a/src/runtime/interr.c +++ b/src/runtime/interr.c @@ -39,9 +39,44 @@ default_lossage_handler(void) } static void (*lossage_handler)(void) = default_lossage_handler; +#if QSHOW +static void +configurable_lossage_handler() +{ + void lisp_backtrace(int frames); + + if (dyndebug_config.dyndebug_backtrace_when_lost) { + fprintf(stderr, "lose: backtrace follows as requested\n"); + lisp_backtrace(100); + } + + if (dyndebug_config.dyndebug_sleep_when_lost) { + fprintf(stderr, +"The system is too badly corrupted or confused to continue at the Lisp.\n" +"level. The monitor was enabled, but you requested `sleep_when_lost'\n" +"behaviour though dyndebug. To help with your debugging effort, this\n" +"thread will not enter the monitor, and instead proceed immediately to an\n" +"infinite sleep call, maximizing your chances that the thread's current\n" +"state can be preserved until you attach an external debugger. Good luck!\n"); + for (;;) +# ifdef LISP_FEATURE_WIN32 + Sleep(10000); +# else + sleep(10); +# endif + } + + monitor_or_something(); +} +#endif + void enable_lossage_handler(void) { +#if QSHOW + lossage_handler = configurable_lossage_handler; +#else lossage_handler = monitor_or_something; +#endif } void disable_lossage_handler(void) { @@ -53,7 +88,7 @@ void print_message(char *fmt, va_list ap) { fprintf(stderr, " in SBCL pid %d",getpid()); #if defined(LISP_FEATURE_SB_THREAD) - fprintf(stderr, "(tid %lu)", (unsigned long) thread_self()); + fprintf(stderr, "(tid %lu)", (uword_t) thread_self()); #endif if (fmt) { fprintf(stderr, ":\n"); @@ -79,7 +114,7 @@ lose(char *fmt, ...) va_list ap; /* Block signals to prevent other threads, timers and such from * interfering. If only all threads could be stopped somehow. */ - block_blockable_signals(); + block_blockable_signals(0, 0); fprintf(stderr, "fatal error encountered"); va_start(ap, fmt); print_message(fmt, ap); @@ -95,8 +130,10 @@ void corruption_warning_and_maybe_lose(char *fmt, ...) { va_list ap; +#ifndef LISP_FEATURE_WIN32 sigset_t oldset; - thread_sigmask(SIG_BLOCK, &blockable_sigset, &oldset); + block_blockable_signals(0, &oldset); +#endif fprintf(stderr, "CORRUPTION WARNING"); va_start(ap, fmt); print_message(fmt, ap); @@ -109,10 +146,13 @@ corruption_warning_and_maybe_lose(char *fmt, ...) fflush(stderr); if (lose_on_corruption_p) call_lossage_handler(); +#ifndef LISP_FEATURE_WIN32 else thread_sigmask(SIG_SETMASK,&oldset,0); +#endif } +char *internal_error_descriptions[] = {INTERNAL_ERROR_NAMES}; /* internal error handler for when the Lisp error system doesn't exist * * FIXME: Shouldn't error output go to stderr instead of stdout? (Alas, @@ -125,7 +165,9 @@ describe_internal_error(os_context_t *context) int len, scoffset, sc, offset, ch; len = *ptr++; - printf("internal error #%d\n", *ptr++); + printf("internal error #%d (%s)\n", *ptr, + internal_error_descriptions[*ptr]); + ptr++; len--; while (len > 0) { scoffset = *ptr++;