問題タブ [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.

0 投票する
1 に答える
331 参照

objective-c - XPC サービス: ワーカー スレッドのスタック サイズを上げる

背景コンテキスト:

macOS 10.11+ 用に構築されたアプリケーションがあります。このアプリは、時折クラッシュする可能性のあるサードパーティ コードを実行する必要があります ( Libsass コンパイラ)。アプリ全体がダウンするのを避けるために、NSXPCConnectionこのコードを実行する XPC サービスを (Xcode で標準の XPC サービス テンプレートを使用して) 作成しました。


私の問題:

XPC サービスは、コードを実行するスレッドのスタック サイズを に設定しているようです。これは、メイン スレッド以外のスレッドの512kbmacOS のデフォルトです。(メインスレッドのスタックサイズはデフォルトです。)8MB

Libsass コンパイラは、深い再帰を伴う特定のファイル (したがって、多くのスタック フレーム) でスタック オーバーフローによりクラッシュすることがあります。

注意:アプリのメイン スレッドで (XPC を使用せずに)まったく同じ Libsass シーケンスを実行すると、すべてが正常に動作し、スタック オーバーフローが発生しないため、これが問題であることはわかっています。


必要なもの:

XPC サービスが作業を実行するスレッドのスタック サイズを増やす方法。


私が試したこと:

-Wl,-stack_size,4000000XPC サービス ターゲットの「その他のリンカー フラグ」ビルド設定に既に追加しています。これにより、スタック サイズが 64MB (許容される最大サイズ) に設定されます。ビルド後、Finder で XPC パッケージを検査し、次のコマンドを使用してリンカーによってこのフラグが正しく適用されていることを確認します。

これにより、次の出力が生成されます: stacksize 67108864、スタック サイズが実際に に設定されていることを示します64MB

問題は、これがサービスのメインスレッドにのみ適用され、XPC メソッドがサービスのメイン スレッドで呼び出されないように見えることです。XPC メソッド内で呼び出されたとき[NSThread isMainThread]に返される を使用して、これを確認しました。false

それで、私はメインスレッドで作業を強制的dispatch_async(dispatch_get_main_queue() ^{...});に実行しようとしましたが、それでもそのブロックから-isMainThread戻ります。さらに、 を使用すると、このコードが実行されているスレッドにスタックがあることを示す が得られます。素晴らしい。false[NSThread currentThread] stackSize]524288512kb

を使用して、実行時にスタックサイズを動的に上げることも試みましたsetrlimit()。これで問題は解決しませんでした。

私はたくさんのドキュメントを読みました。XPC サービスがどのスレッドを使用するか、およびそれらをどのように使用するかについての詳細は、私たちが気にする必要のない実装の詳細のようです。