}
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)
{
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);
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);
#endif
}
\f
+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,
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++;