static VALUE rescue_callback(VALUE arg) { VALUE error; VALUE e = rb_errinfo(); VALUE bt = rb_funcall(e, rb_intern("backtrace"), 0); VALUE msg = rb_funcall(e, rb_intern("message"), 0); bt = rb_ary_entry(bt, 0); error = rb_sprintf("%"PRIsVALUE": %"PRIsVALUE" (%s)\n", bt, msg, rb_obj_classname(e)); rb_write_error(StringValuePtr(error)); rb_backtrace(); ruby_finalize(); exit(-1); return Qnil; }
static void sig_handler(int sig, siginfo_t *siginfo, void *context) { /* safe guard variable - we call backtrace() only on first * UIE call. This prevent endless loop if backtrace() touches * memory regions which cause abort */ static bool triggered = false; lcd_set_backdrop(NULL); lcd_set_drawmode(DRMODE_SOLID); lcd_set_foreground(LCD_BLACK); lcd_set_background(LCD_WHITE); unsigned line = 0; lcd_setfont(FONT_SYSFIXED); lcd_set_viewport(NULL); lcd_clear_display(); /* get context info */ ucontext_t *uc = (ucontext_t *)context; unsigned long pc = uc->uc_mcontext.pc; unsigned long sp = uc->uc_mcontext.gregs[29]; lcd_putsf(0, line++, "%s at %08x", strsignal(sig), pc); if(sig == SIGILL || sig == SIGFPE || sig == SIGSEGV || sig == SIGBUS || sig == SIGTRAP) lcd_putsf(0, line++, "address 0x%08x", siginfo->si_addr); if(!triggered) { triggered = true; rb_backtrace(pc, sp, &line); } #ifdef ROCKBOX_HAS_LOGF lcd_putsf(0, line++, "logf:"); logf_panic_dump(&line); #endif lcd_update(); system_exception_wait(); /* If this returns, try to reboot */ system_reboot(); while (1); /* halt */ }
static void on_flash_file_event (FlashFile *file, FlashFileEvent event, gpointer user_data) { VALUE cb; int exc; VALUE args[3]; cb = (VALUE)user_data; args[0] = cb; args[1] = FILE_NEW_REFERENCE (file); args[2] = INT2FIX (event); exc = 0; rb_protect (execute_callback, (VALUE)args, &exc); if (exc) { rb_warn(" FlashFile callback raised exception, backtrace:"); rb_backtrace(); } }
static int error_handle(int ex) { int status = EXIT_FAILURE; switch (ex & TAG_MASK) { case 0: status = EXIT_SUCCESS; break; case TAG_RETURN: Warning("unexpected return"); break; case TAG_NEXT: Warning("unexpected next"); break; case TAG_BREAK: Warning("unexpected break"); break; case TAG_REDO: Warning("unexpected redo"); break; case TAG_RETRY: Warning("retry outside of rescue clause"); break; case TAG_THROW: Warning("unexpected throw"); break; case TAG_RAISE: Warning("unexpected raise"); break; case TAG_FATAL: Warning("unexpected fatal"); break; default: Warning("Unknown longjmp status %d", ex); break; } rb_backtrace(); return status; }
static char * load_lock(const char *ftptr) { st_data_t data; st_table *loading_tbl = get_loading_table(); if (!loading_tbl || !st_lookup(loading_tbl, (st_data_t)ftptr, &data)) { /* loading ruby library should be serialized. */ if (!loading_tbl) { GET_VM()->loading_table = loading_tbl = st_init_strtable(); } /* partial state */ ftptr = ruby_strdup(ftptr); data = (st_data_t)rb_barrier_new(); st_insert(loading_tbl, (st_data_t)ftptr, data); return (char *)ftptr; } if (RTEST(ruby_verbose)) { rb_warning("loading in progress, circular require considered harmful - %s", ftptr); rb_backtrace(); } return RTEST(rb_barrier_wait((VALUE)data)) ? (char *)ftptr : 0; }
void zeitgeist::RbPrintError() { std::cout << RbGetError().c_str() << std::endl; rb_backtrace(); }