問題タブ [nsxpcconnection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - XPC サービス: ワーカー スレッドのスタック サイズを上げる
背景コンテキスト:
macOS 10.11+ 用に構築されたアプリケーションがあります。このアプリは、時折クラッシュする可能性のあるサードパーティ コードを実行する必要があります ( Libsass コンパイラ)。アプリ全体がダウンするのを避けるために、NSXPCConnection
このコードを実行する XPC サービスを (Xcode で標準の XPC サービス テンプレートを使用して) 作成しました。
私の問題:
XPC サービスは、コードを実行するスレッドのスタック サイズを に設定しているようです。これは、メイン スレッド以外のスレッドの512kb
macOS のデフォルトです。(メインスレッドのスタックサイズはデフォルトです。)8MB
Libsass コンパイラは、深い再帰を伴う特定のファイル (したがって、多くのスタック フレーム) でスタック オーバーフローによりクラッシュすることがあります。
注意:アプリのメイン スレッドで (XPC を使用せずに)まったく同じ Libsass シーケンスを実行すると、すべてが正常に動作し、スタック オーバーフローが発生しないため、これが問題であることはわかっています。
必要なもの:
XPC サービスが作業を実行するスレッドのスタック サイズを増やす方法。
私が試したこと:
-Wl,-stack_size,4000000
XPC サービス ターゲットの「その他のリンカー フラグ」ビルド設定に既に追加しています。これにより、スタック サイズが 64MB (許容される最大サイズ) に設定されます。ビルド後、Finder で XPC パッケージを検査し、次のコマンドを使用してリンカーによってこのフラグが正しく適用されていることを確認します。
これにより、次の出力が生成されます: stacksize 67108864
、スタック サイズが実際に に設定されていることを示します64MB
。
問題は、これがサービスのメインスレッドにのみ適用され、XPC メソッドがサービスのメイン スレッドで呼び出されないように見えることです。XPC メソッド内で呼び出されたとき[NSThread isMainThread]
に返される を使用して、これを確認しました。false
それで、私はメインスレッドで作業を強制的dispatch_async(dispatch_get_main_queue() ^{...});
に実行しようとしましたが、それでもそのブロック内から-isMainThread
戻ります。さらに、 を使用すると、このコードが実行されているスレッドにスタックがあることを示す が得られます。素晴らしい。false
[NSThread currentThread] stackSize]
524288
512kb
を使用して、実行時にスタックサイズを動的に上げることも試みましたsetrlimit()
。これで問題は解決しませんでした。
私はたくさんのドキュメントを読みました。XPC サービスがどのスレッドを使用するか、およびそれらをどのように使用するかについての詳細は、私たちが気にする必要のない実装の詳細のようです。