1

Objective-C で Ruby 拡張機能をビルドしました。マクロ ベースの例外処理とセルフ ビルド エラー処理の代わりに @throw/@catch などを使用したいと考えています。

GCC に同梱されている GNU ランタイムを使用しています。
拡張機能を使用して Ruby アプリを実行すると、例外が発生するとすぐにコア ダンプが発生します。abort() は GNU Objective-C ランタイムに由来します (libobjc/exception.c:375):

void
objc_exception_throw (id value)
{
  struct ObjcException *header = calloc (1, sizeof (*header));
  header->base.exception_class = __objc_exception_class;
  header->base.exception_cleanup = __objc_exception_cleanup;
  header->value = value;

#ifdef SJLJ_EXCEPTIONS
  _Unwind_SjLj_RaiseException (&header->base);
#else
  _Unwind_RaiseException (&header->base);
#endif

  /* Some sort of unwinding error.  */
  abort ();
}

でコンパイルしたので、呼び出されていると-fobjc-exceptions思います。_Unwind_RaiseException

Ruby拡張機能でObjective-C例外を使用する方法はありますか?

4

1 に答える 1

0

問題が解決しました:

_Unwind_(SjLj_)RaiseExceptionGNU Objective-C ランタイムは(上記のコードを参照)の結果を処理しません。私の場合、5これは「スタックの終わり」を表し、@try/@catch ブロックを忘れていたことを意味します。

実際には、ログを記録するか、それを自分で行うためのフックが必要です。

アップデート:

Ruby を Objective-C の例外処理でコンパイルしない限り-fobjc-exceptions、Ruby コードからスタックをトレースすることはできません。したがって、Ruby に制御を渡す前に、Objective-C 例外をキャッチしてラップまたは変換する必要があります。

于 2010-09-15T08:59:19.220 に答える