2017-10-10 202 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

相关问题