Esempio n. 1
0
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;
}
Esempio n. 2
0
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 */
}
Esempio n. 3
0
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();
	}
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
void zeitgeist::RbPrintError()
{
  std::cout << RbGetError().c_str() << std::endl;
  rb_backtrace();
}