12

アプリを 10.6 から 10.8 に移植しています。アプリにロードするdylibを見ています。ガベージ コレクション ワーク キューで非常に異常なクラッシュが発生し、次のメッセージが表示されます。

malloc: Thread::suspend():  unable to suspend a thread:  err = 268435459, Thread 0x111000000: _pthread = 0x108129000, _thread = 0x8b07, _stack_base = 0x108129000, enlivening  on, 0 local blocks

アプリケーション用GCC_ENABLE_OBJC_GC = requiredが設定されています。dylibを使用している場合GCC_ENABLE_OBJC_GC = requiredでもクラッシュします。アプリケーションでガベージ コレクタをオフにできません。dylib からのクラッシュを管理する必要があります。

クラッシュの原因は、ガベージ コレクターがスレッドを中断できないことが原因であることが判明しました。(ログにあるように)。このスレッドは、thread_create()を使用して作成されます。dylib のコンストラクターに (スリープを使用して) 無期限の while ループを配置すると、クラッシュしません。コンストラクターが実行を終了すると、クラッシュします。

ガベージコレクターにスレッドを一時停止しようとしないように指示する方法はありますか? または、スレッドの参照カウントを増やすには?または、ガベージコレクターを停止してdylibコードに干渉しないようにするためにできること。

4

2 に答える 2

-1

アプリを 10.6 から 10.8 に移植しています。クラッシュの原因は、ガベージ コレクターがスレッドを中断できないことが原因であることが判明しました。

期待されています。
OSX 10.8 以降、ガベージ コレクションは廃止されました。そのため、CG はスレッドを中断してその役割を実行することができません。その結果、直面しているすべての問題を解決できます。

10.8 向けに開発する場合は、ARC (最適) に変換するか、手動参照カウントに戻す必要があります。arc に移行する場合は、ARC リリース ノートへの移行を参照してください。


10.8に関するAppleのドキュメントから:

重要: OS X v10.8 以降、ガベージ コレクションは廃止されました。代わりに ARC (自動参照カウント) を使用してください。ARC の詳細については、「ARC リリース ノートへの移行」を参照してください。

出典: OS X v10.8 Mountain Lion の新機能:

答え:

  • ガベージコレクターにスレッドを一時停止しようとしないように指示する方法はありますか?

いいえ、そのように機能します。

  • または、スレッドの参照カウントを増やすには?または、dylib コードに干渉しないようにガベージ コレクターを停止するためにできること。

いいえ。GC は 10.8 では非推奨になっているため、10.8 をサポートするには、GC を削除する必要があります。

GC は、MAC プラットフォームでは本当に短命のテクノロジーでした。そして、さまざまな理由でARCに置き換えられました。

于 2013-04-06T12:58:29.953 に答える