2017-10-10 4 views
0

おはよう、MacOSX SierraでlibdispatchエラーEVFILT_MACHPORTが発生する原因は何ですか?

私のアプリケーションではクラッシュに直面しています。ユーザーが開始しようとすると、彼は1分待ってからstd :: exceptionが呼び出されます。本当に私は自分自身でバグを再現できませんでしたが、それはかなり共通の問題です。 libdispatchクライアントで

BUG::私は追跡することができ

唯一のことは、syslogに次の行でのkeventは[EVFILT_MACHPORT]監視対象リソースは、私がグーグルを開始し、キャンセルハンドラが次に

呼び出されたソースの前に消えましたそれと私ははるかに多くを見つけることができません...私は(おそらく、私はafaikを使用しない、または少なくとも直接... ...)GCDといくつかの問題である "仮定"することができます。私がインターネットで見たのは、それがMacOSX Sierraに関連しているということです。しかし、フォーラムの大半は答えがありません。ユニークな結果を出さずに試してみてください。たぶん、私はテストしていない、とにかく私が使用したくない)回避策について少し明確に思われる唯一のWebページはthisです。

そう...:

  • 誰かがlibdispatchで例外が発生する可能性がありますどのような明確に持っていますか?
  • 誰かが私に良いリンク、公式のドキュメントなどを教えてくれますか?
  • これは更新なしでSierraのバグになる可能性がありますか?
  • アプリケーションのインストーラに関連していますか?
  • 誰かがこの例外をテストプログラムで再現する方法を知っていますか?

答えて

1

このlibdispatchログメッセージは致命的ではなく、ほぼ確実にキャッチされないC++例外による打ち切り(crashreport /バックトレースせずに、より多くの何も言うことは困難である)のように聞こえるあなたのクラッシュ、とは関係ありません。 libdispatch自体はC++例外FWIWを生成しません。その特定のログメッセージの意味については

、それはdispatch_source_createに、次のセクションに関連する(3)のmanページ:

キャンセル: 重要:キャンセルハンドラはファイルディスクリプタとマッハポートのために必要ですディスクリプタを安全に閉じるか、ポートを破棄するには、 の順に入力します。キャンセルハンドラが実行される前にディスクリプタまたはポートを閉じると、競合状態が発生する可能性があります。ソースのイベントハンドラがまだ実行されている間に、新しいディスクリプタが同じ閉じたディスクリプタと同じ 値で割り当てられている場合、イベント ハンドラは、誤った記述子にデータを書き込む。

あなたがEVFILT_MACHPORTが表示された場合は、メッセージをログ「消えた」、あなたのプロセスで誰かがそのAPI契約に違反したとディスパッチソースはまだ参照してください(EV_VANISHEDのkeventを生成するためのカーネルを引き起こす)、それを監視している間にmachportを割り当て解除しましたsource code

+0

swift上のlibdispatchのlinuxポートは、代わりにあなたのプロセスをクラッシュさせます(github repo @dasのEPOLLFREEを探してみてください)。しかし悲しいことに、Darwinポートはこれを1日目から強制しません。 – user1775617

+0

私が探していた答えではありませんでしたが、それは正しいものと思われます...ありがとう – n3mo

関連する問題