2017-10-10 240 views
0

早上好,MacOSX Sierra中導致libdispatch錯誤EVFILT_MACHPORT的原因是什麼?

我面對我的應用程序崩潰。當用戶嘗試啓動它時,他會等待一分鐘,然後引發std :: exception。真的,我自己無法重現這個錯誤,但這似乎是一個很常見的問題。

我可以跟蹤的唯一的事情是在系統日誌下面一行:

BUG在libdispatch客戶端:KEVENT [EVFILT_MACHPORT]監測資源的源取消處理程序調用

然後才消失了,我開始到谷歌它和我找不到更多...我只能「假設」這是GCD(我不使用afaik,或者至少不是直接...)的問題。我在互聯網上看到的是它與MacOSX Sierra有關。但大多數論壇都沒有答案,只是很多嘗試沒有獨特的結果。也許唯一的網頁似乎有點清楚解決方法(我還沒有測試,而且我不想使用)是this

所以...:

  • 有人清楚什麼可以引起libdispatch例外呢?
  • 有人可以給我一些很好的鏈接,官方文檔或什麼?
  • 是真的,可以在沒有更新的Sierra中發現錯誤?
  • 它可能與應用程序的安裝程序有關嗎?
  • 有人知道用測試程序重現此異常的方法嗎?

回答

1

這libdispatch日誌消息不是致命的,而且幾乎可以肯定是不相關的崩潰,這聽起來像一箇中止由於未捕獲的C++異常(無crashreport /回溯就很難說什麼)。 libdispatch本身不會生成任何C++異常FWIW。

至於該特定的日誌信息的含義,它涉及到在dispatch_source_create(3)手冊頁的以下部分:

CANCELLATION: 重要的:取消處理程序所需的文件描述符和MACH端口以 的順序安全地關閉描述符或銷燬端口。取消處理程序運行時,可能導致競爭條件之前關閉描述或端口:如果一個新的描述符與相同 值分配爲最近關閉的描述,而源的事件處理程序仍在運行,事件 處理程序可以讀取/將數據寫入錯誤的描述符。

如果看到EVFILT_MACHPORT「消失」日誌消息,有人在你的進程已經違反了API合同,並釋放一個machport而派遣源仍然監視它​​(導致內核生成EV_VANISHED KEVENT),見source code

+0

Swift上的libdispatch的linux端口實際上會讓您的進程崩潰(在剛剛鏈接的github repo @das中查找EPOLLFREE),但可悲的是Darwin端口並沒有從第1天起強制執行此操作,所以它只是一個日誌。 – user1775617

+0

不是我正在尋找的答案,但我想這是正確的答案...謝謝 – n3mo

相關問題