是什么导致MacOSX Sierra中的libdispatch错误EVFILT_MACHPORT?

时间:2017-10-10 12:35:00

标签: c++ macos qt macos-sierra libdispatch

早上好,

我的申请面临崩溃。当用户尝试启动它时,他等待一分钟,然后引发std :: exception。真的我不能自己重现这个bug,但这似乎是一个很常见的问题。

我唯一能跟踪的是syslog中的以下行:

libdispatch客户端中的BUG:在调用源取消处理程序之前,kevent [EVFILT_MACHPORT]受监视资源消失了

然后,我开始谷歌它,我找不到更多...我只能"假设"这是GCD的一些问题(我不使用afaik,或者至少不直接使用......)。我在互联网上看到的是它与MacOSX Sierra有关。但大多数论坛都没有答案,只有很多尝试没有独特的结果。也许唯一一个似乎有点清楚解决方法的网页(我没有测试,反正我不想使用)是this

所以...

  • 有人清楚了解导致libdispatch异常的原因吗?
  • 有人可以给我一些好的链接,官方文档或其他什么吗?
  • 在没有更新的情况下,Sierra可能是一个错误吗?
  • 是否与应用程序的安装程序有关?
  • 有人知道用测试程序重现此异常的方法吗?

1 个答案:

答案 0 :(得分:3)

这个libdispatch日志消息并不是致命的,几乎可以肯定与你的崩溃无关,这听起来像是由于未被捕获的C ++异常导致的中止(没有崩溃报告/回溯,很难再说些什么)。 libdispatch本身不会生成任何C ++异常FWIW。

关于该特定日志消息的含义,它与dispatch_source_create(3)联机帮助页中的以下部分有关:

  

CANCELLATION:        重要提示:按顺序,文件描述符和基于机器端口的源需要取消处理程序        安全地关闭描述符或破坏端口。在取消处理程序运行之前关闭描述符或端口可能会导致竞争条件:如果新的描述符分配了相同的        值作为最近关闭的描述符,而源的事件处理程序仍在运行,即事件        handler可能会将数据读/写到错误的描述符。

如果你看到EVFILT_MACHPORT"消失了#34;日志消息,您的进程中的某个人违反了该API合同并在调度源仍在监视它时释放了一个机器人端口(导致内核生成EV_VANISHED kevent),请参阅source code

相关问题