Иногда бывает, что ruby exception летит из кишок C кода. Хочется знать место, в котором происходит ошибка. Я решил этот вопрос так:
VALUE frame_call(const char* file, const int line, const char* func, VALUE object, ID method, const int count,…) {struct FRAME frame;
frame.prev = ruby_frame;
ruby_frame = &frame;
frame.last_func = rb_intern(func);
struct RNode node;
node.nd_file = const_cast<char >(file);
nd_set_line(&node,line);
frame.node = &node;
va_list ap;
va_start(ap, count);
VALUE retval = rb_funcall2(object, method, count, (const VALUE)ap);
ruby_frame = frame.prev;
return retval;
}
#define CALL frame_call(FILE,
LINE, func, object, method, count, ##__VA_ARGS__)
Соответственно, вместо rb_funcall используем CALL.