2013-03-10 8 views
5

Ich verwende NSTask, um meine Hilfsprogramm ausführen. Auf 99% meiner Kundensysteme funktioniert das gut, aber zwei kamen zu mir zurück und ließen mich wissen, dass es nicht funktioniert. Einer von ihnen war nett genug, um mir das Problem per Remote Desktop anzusehen.NSTask Subprozess stecken in _dyld_start

Ich probierte viele verschiedene NSPipe/NSFileHandle Kombination für StandardOutput/StandardError, um sicherzustellen, dass das Problem nicht im Zusammenhang mit dem Auffüllen dieser Puffer. Beispiel 1 und 2. Meine Vermutung ist, dass es nicht verwandt ist, weil es auf so vielen Systemen funktioniert und _dyld_start ist zu früh im Anwendungslebenszyklus, um StandardOutput/StandardError zu füllen.

Weitere Hinweise über das Problem:

  • Starten der Helfer-App aus dem Terminal funktioniert gut.
  • Anbringen und die GDB auf dem steckengebliebenen Prozess lösen und nach Wert funktioniert es gut und wenn es fertig NSTask nimmt Arbeit nach -waitUntilExit.
  • Mit Gabel (2) und execv (3) statt NSTask der Lage ist, zu starten und die Helfer gut laufen.
  • Der Parent-Prozess ist Sandboxed aber ich denke, vorherige Berichte, wo nicht-Sandboxed auf Mac OS X 10.6/10.7.

Screenshot des Prozesses Probe von Activity Monitor:

Activity Monitor

Irgendwelche Hinweise oder Tipps zur Fehlersuche, um herauszufinden, warum die Helfer in _dyld_start stecken sind willkommen!

+0

Warum veröffentlichen Sie Bilder von Textdaten? Kopieren Sie den Textbeispielbericht und fügen Sie ihn ein. Überprüfen Sie außerdem, ob Konsolenprotokollnachrichten vorhanden sind. Und prüfen Sie nach 'DYLD_ *' Umgebungsvariablen. –

+1

Empfehlung, die Konsole zu überprüfen. Für 'DYLD_' -Umgebungsvariablen, vorausgesetzt, Sie setzen sie nicht selbst, suchen Sie in ~/.MacOSX/environment.plist. –

+0

Konsole hat nichts verraten. Wird 'DYLD_' beim nächsten Zugriff auf das Gerät überprüfen. – catlan

Antwort

-1

Da niemand antwortete, werfe ich ein paar Ideen auf. Vielleicht einer von ihnen ist die Antwort - nur raten - aber da Hinweise und Tipps sind willkommen, können Sie einen Blick auf:

  • die Liste der geladenen Bibliotheken in den Crash-Dump (es kann ein Hinweis da sein)
  • jeder Fehler, der im Child-Prozess (nach der Gabelung) passieren würde. Ich sehe jedoch, warum es schwierig sein könnte, einen Post-Fork-Fehler zurück zu bekommen.

Wenn ich mich richtig erinnere, ruft NSTask posix_spawn(2). Dies könnte ein Hinweis sein, da die Verwendung von fork(2) und execv(3) scheinbar funktioniert, könnten Sie sich auf die Unterschiede zwischen NSTask und der nicht blockierenden Alternative konzentrieren. Es ist klar, dass am Anfang etwas passiert, das verhindert, dass das Kind richtig ausgeführt wird.

  • Sind Sie sicher, dass es klemmt und nicht abgestürzt ist? Soweit der Nutzer merkt, würde Ihre App nicht so aussehen, als wäre sie abgestürzt. Nur der Kindprozess würde abstürzen.
  • Als letzten Ausweg könnten Sie versuchen, nach einer eventuell auftretenden Mach-Ausnahme zu suchen (falls irgendeinen, würde das einen Fehler bedeuten, den Sie nicht wiederherstellen könnten. Aber es würde trotzdem wertvolle Hinweise geben).
  • Sie können willigen Kunden sagen, Ihnen ihre sysdiagnose zu senden.
    Zu diesem Ziel, fragen sie Befehl + Option + Steuerung + zu treffen. + Shift warten ein paar Minuten. Bald darauf sollte ihr Finder ein Fenster öffnen, um eine Datei namens: sysdiagnose_timestamp_.tar.gz zu enthüllen. Bitten Sie sie bitte, es Ihnen zu schicken. Meine ist ungefähr 5 MB. Mehr Details auf der sysdiagnose man page.
+0

@catlan Hatten Sie die Zeit, einen oder mehrere der Vorschläge (vor allem die Sysdiagnose) zu untersuchen? – Jean

+0

Kann ich den Text in Ihrer Frage auch auf den Apple Mailinglisten verwenden? Es gibt einige Ingenieure von Apple, die bereit sind zu helfen. – Jean

+0

Ich frage meinen Kunden nach einer sysdiagnose aber habe kein Herz zurück ... Frag einfach in der mail-Liste. Bitte posten Sie den Link zum Mail-Listen-Thread hier, damit ich ihn auch verfolgen kann. – catlan