2013-03-10 25 views
5

Używam NSTask do uruchomienia aplikacji pomocniczej. W 99% jeden z moich systemów klienckich działa dobrze, ale dwóch wróciło do mnie, informując mnie, że tak nie jest. Jeden z nich był na tyle miły, że pozwolił mi zajrzeć do problemu na zdalny pulpit.Subprocess NSTask utknął w _dyld_start

Próbowałem wiele różnych kombinacji NSPipe/NSFileHandle dla StandardOutput/StandardError, aby upewnić się, że problem nie jest związany z wypełnianiem tych buforów. Przykład 1 i 2. Domyślam się, że nie jest on związany, ponieważ działa dobrze na tak wielu systemach, a _dyld_start jest zbyt wcześnie w cyklu życia aplikacji, aby wypełnić StandardOutput/StandardError.

Inne uwagi o problemie:

  • Uruchamianie aplikacji pomocnika z terminal działa poprawnie.
  • Podłączanie i odłączanie GDB na proces zatrzymany i po-warto to działa dobrze, a kiedy skończył NSTask odbiera pracę po -waitUntilExit.
  • Korzystanie fork (2) i execv (3) zamiast NSTask jest w stanie uruchomić i uruchomić pomocnika grzywny.
  • Proces nadrzędny jest piaskowany, ale uważam, że poprzednie raporty nie były piaskowane w systemie Mac OS X 10.6/10.7.

Zrzut próbki procesowej z Activity Monitor:

Activity Monitor

Wszelkie wskazówki lub porady debugowania, aby dowiedzieć się, dlaczego pomocnik tkwi w _dyld_start są mile widziane!

+0

Dlaczego publikujesz zdjęcia tekstowe? Skopiuj i wklej tekstowy przykładowy raport. Sprawdź również komunikaty dziennika konsoli. I sprawdź zmienne środowiskowe 'DYLD_ *'. –

+1

Przekazywanie rekomendacji w celu sprawdzenia konsoli. Dla zmiennych środowiskowych 'DYLD_', zakładając, że nie ustawiasz ich samodzielnie, zajrzyj do ~/.MacOSX/environment.plist. –

+0

Konsola nie ujawniła niczego. Sprawdzę 'DYLD_' przy następnym uzyskaniu dostępu do maszyny. – catlan

Odpowiedz

-1

Ponieważ nikt nie odpowiedział, rzucam kilka pomysłów. Może jeden z nich jest odpowiedź - tylko zgadywać - ale ponieważ wskazówki i porady są mile widziane, można przyjrzeć:

  • liście załadowanych bibliotek na zrzut awaryjny (nie może być wskazówką tam)
  • jakikolwiek błąd, który wystąpiłby w procesie potomnym (po rozwidleniu). Jednak widzę, dlaczego może być trudno odzyskać jakikolwiek błąd po rozwidleniu.

Jeśli dobrze pamiętam, NSTask wywołuje posix_spawn(2). To może być wskazówka, ponieważ używanie fork(2) i execv(3) wydaje się działać, możesz skupić się na różnicach między NSTask i nie blokującą alternatywą. Najwyraźniej coś dzieje się na samym początku, co uniemożliwia dziecku prawidłowe wykonanie.

  • Czy jesteś pewien, że utknął i nie jest uszkodzony? O ile użytkownik może powiedzieć, że Twoja aplikacja nie będzie wyglądać, jakby się zawiesiła. Tylko proces potomny ulegnie awarii.
  • W ostateczności możesz spróbować wyszukać dowolny wyjątek Mach (jeśli jest to , co oznaczałoby błąd, którego nie można w żaden sposób odzyskać, ale mimo to dostarczył cennych wskazówek).
  • Możesz powiedzieć chętnym klientom, aby wysłali Ci ich diagnozę.
    Do tego celu, poproś, aby uderzyć komenda + opcja + Kontrola + . + Shift czekać kilka minut. Wkrótce ich wyszukiwarka powinna otworzyć okno, aby odsłonić plik o nazwie: sysdiagnose_timestamp_.tar.gz. Uprzejmie prosimy o przesłanie go pocztą. Mój jest około 5 MB. Więcej szczegółów na temat sysdiagnose man page.
+0

@catlan czy miałeś czas na zbadanie jednej lub więcej sugestii (szczególnie sysdiagnose)? – Jean

+0

Czy mogę użyć tekstu w pytaniu tak, jak na listach mailingowych firmy Apple? Jest tam kilku inżynierów z Apple, którzy mogą chcieć pomóc. – Jean

+0

Pytam mojego klienta o sysdiagnozę, ale nie mam z powrotem serca ... Zapraszam do zadawania pytań na liście mailowej. Opublikuj link do wątku listy dyskusyjnej tutaj, aby móc go również śledzić. – catlan