1

早上好,

我的应用程序面临崩溃。当用户尝试启动它时,他会等待一分钟,然后引发 std::exception。真的,我自己无法重现该错误,但这似乎是一个很常见的问题。

我唯一可以跟踪的是系统日志中的以下行:

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

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

所以...:

  • 有人清楚什么会导致 libdispatch 中的异常?
  • 有人可以给我一些好的链接,官方文档或其他东西吗?
  • 如果没有更新,这可能是 Sierra 中的错误,这是真的吗?
  • 它可能与应用程序的安装程序有关吗?
  • 有人知道用测试程序重现此异常的方法吗?
4

1 回答 1

3

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

至于该特定日志消息的含义,它与 dispatch_source_create(3) 手册页中的以下部分有关:

取消:重要:文件描述符和基于 mach 端口的源需要取消处理程序,以便安全地关闭描述符或销毁端口。在取消处理程序运行之前关闭描述符或端口可能会导致竞争条件:如果在源的事件处理程序仍在运行时分配了与最近关闭的描述符相同的值的新描述符,则事件处理程序可以读取/写入数据到错误的描述符。

如果您看到 EVFILT_MACHPORT “消失”日志消息,则您的进程中的某人违反了该 API 合同并在调度源仍在监视它时释放了 machport(导致内核生成 EV_VANISHED kevent),请参阅源代码

于 2017-10-11T04:52:58.263 回答