2017-10-10 3 views
0

Guten Morgen,Was verursacht libdispatch Fehler EVFILT_MACHPORT in MacOSX Sierra?

Ich stehe vor einem Absturz in meiner Anwendung. Wenn der Benutzer versucht, es zu starten, wartet er wie eine Minute und dann wird eine std :: exception ausgelöst. Wirklich konnte ich den Fehler nicht selbst reproduzieren, aber es scheint ein ziemlich allgemeines Problem zu sein.

Das einzige, was ich die folgende Zeile in syslog verfolgen könnte:

BUG in libdispatch Client: kevent [EVFILT_MACHPORT] überwachte Ressource verschwunden, bevor die Quelle Handlers

Dann aufgerufen wurde, beginne ich zu Google es und ich kann nicht viel mehr finden ... Ich kann nur "annehmen" das ist ein Problem mit GCD (dass ich afaik nicht benutze, oder zumindest nicht direkt ...). Was ich im Internet gesehen habe, ist, dass es mit MacOSX Sierra verwandt ist. Aber die Mehrheit des Forums hat keine Antwort, nur eine Menge Versuche ohne ein einzigartiges Ergebnis. Vielleicht ist die einzige Webseite, die über einen Workaround (den ich nicht getestet habe und den ich sowieso nicht benutzen möchte) ein wenig klar erscheint, this.

So ...:

  • hat jemand klar, was die Ausnahme in libdispatch verursachen können?
  • kann jemand mir einen guten Link, offizielle Dokumentation oder etwas geben?
  • Ist wahr, dass ein Fehler in Sierra ohne Updates sein kann?
  • Könnte es mit dem Installer einer Anwendung zusammenhängen?
  • Kennt jemand einen Weg, diese Ausnahme mit einem Testprogramm zu reproduzieren?

Antwort

1

Diese libdispatch Lognachricht ist nicht tödlich, und mit ziemlicher Sicherheit nicht auf den Absturz im Zusammenhang, das wie ein Abbruch aufgrund einer nicht abgefangenen C++ Ausnahme klingt (ohne crashreport/Backtrace es schwierig ist, etwas mehr zu sagen). libdispatch generiert selbst keine C++ - Ausnahmen FWIW.

In Bezug auf die Bedeutung dieser spezifischen Protokollmeldung bezieht sie sich auf den folgenden Abschnitt in der dispatch_source_create (3) manpage:

RÜCKTRITT: Wichtig: eine Stornierung Handler für Dateideskriptor und mach-Anschluss erforderlich Quellen in der Reihenfolge , um den Deskriptor sicher zu schließen oder den Port zu zerstören. Das Schließen des Deskriptors oder Ports vor dem Ausführen des Abbruchbehandlers kann zu einer Racebedingung führen: Wenn ein neuer Deskriptor mit dem gleichen Wert als der zuletzt geschlossene Deskriptor zugewiesen wird, während der Ereignishandler der Quelle noch läuft, kann das Ereignis Handler lesen/schreibe Daten in den falschen Deskriptor.

Wenn Sie den EVFILT_MACHPORT sehen „verschwunden“ -Meldung einzuloggen, jemand in Ihrem Prozess hat gezeigt, dass API Vertrag verletzt und ausgeplant eine machport während einer Dispatch Quelle noch wurde die Überwachung (wodurch die Kernel eine EV_VANISHED kevent erzeugen), siehe die source code.

+0

Der Linux-Port von libdispatch auf Swift wird stattdessen Ihren Prozess abstürzen (suchen Sie nach EPOLLFREE in der Github Repo @das gerade verknüpft), aber leider der Darwin-Port hat dies vom ersten Tag an nicht erzwungen, so dass es nur ein Protokoll ist. – user1775617

+0

nicht die Antwort, die ich suchte, aber ich nehme an, es ist der richtige ... danke – n3mo

Verwandte Themen