5

NSTaskを使用してヘルパー アプリケーションを実行します。私の顧客システムの 99% 1 つでこれは正常に動作しますが、2 つはそうではないことを私に知らせてきました。そのうちの 1 つは、リモート デスクトップごとに問題を調査できるほど親切でした。

問題がこれらのバッファをいっぱいにすることに関連していないことを確認するために、StandardOutput/StandardError に対してさまざまなNSPipe/NSFileHandleの組み合わせを試しました。12。私の推測では、非常に多くのシステムで正常に動作し、_dyld_start はアプリケーション ライフサイクルの早い段階で StandardOutput/StandardError を埋めることができないため、関連していないと考えられます。

問題に関するその他の注意事項:

  • ターミナルからヘルパー アプリを起動すると正常に動作します。
  • スタックしたプロセスとアフターワースで gdb をアタッチおよびデタッチすると正常に動作し、終了するとNSTaskは-waitUntilExitの後に作業を開始します。
  • NSTaskの代わりにfork(2)execv(3)を使用すると、ヘルパーを正常に起動して実行できます。
  • 親プロセスはサンドボックス化されていますが、以前のレポートでは Mac OS X 10.6/10.7 でサンドボックス化されていないと思います。

アクティビティ モニターからのプロセス サンプルのスクリーンショット:

アクティビティモニター

ヘルパーが _dyld_start で立ち往生している理由を理解するための手がかりやデバッグのヒントは大歓迎です!

4

1 に答える 1

-1

誰も答えなかったので、いくつかのアイデアを投げかけます。おそらく、そのうちの 1 つが答えであり、推測にすぎませんが、手がかりやヒントは大歓迎ですので、以下をご覧ください。

  • クラッシュダンプにロードされたライブラリのリスト (そこに手がかりがあるかもしれません)
  • 子プロセス (フォーク後) で発生するエラー。ただし、フォーク後のエラーを取り戻すのが難しい理由はわかります。

私の記憶が正しければ、NSTask は を呼び出しますposix_spawn(2)fork(2)と を使用すると機能しているように見えるので、これは手掛かりになる可能性がありexecv(3)ます。 と の違いに焦点を当てることができますNSTask。明らかに、子供が適切に実行するのを妨げる何かが最初に起こっています。

  • スタックしていて、クラッシュしていないことを確認していますか? ユーザーが知る限り、あなたのアプリはクラッシュしたようには見えません。子プロセスのみがクラッシュします。
  • 最後の手段として、発生している Mach 例外を探すことができます (発生している場合、それはエラーを意味し、とにかく回復することはできません。しかし、それにもかかわらず、貴重な手がかりが得られます)。
  • sysdiagnose を送信するよう、喜んで顧客に伝えることができます。
    この目標を達成するには、Command+ Option+ Control+ .+Shiftを押して数分間待つように依頼します。その後すぐに、ファインダーにウィンドウが表示され、次の名前のファイルが表示されますsysdiagnose_timestamp_.tar.gz。郵送でお願いします。私のは約5MBです。詳細については、sysdiagnose のマニュアル ページを参照してください。
于 2013-03-25T20:22:41.330 に答える