Я использую NSTask для запуска своего вспомогательного приложения. На 99% одной из моих клиентских систем это работает нормально, но две ответили мне, сообщив мне, что это не так. Один из них был достаточно хорош, чтобы позволить мне изучить проблему для каждого удаленного рабочего стола.
Я испробовал множество различных комбинаций NSPipe/NSFileHandle для StandardOutput/StandardError, чтобы убедиться, что проблема не связана с заполнением этих буферов. Пример 1 и 2. Я предполагаю, что это не связано, потому что он отлично работает на многих системах, а _dyld_start находится слишком рано в жизненном цикле приложения, чтобы заполнять StandardOutput/StandardError.
Другие заметки о проблеме:
- Запуск вспомогательного приложения из терминала работает нормально.
- Присоединение и отсоединение gdb от зависшего процесса и после его завершения работает нормально, а когда оно завершено, NSTask возобновляет работу после -waitUntilExit.
- Использование fork(2) и execv(3) вместо NSTask позволяет нормально запустить и запустить помощник.
- Родительский процесс находится в песочнице, но я думаю, что предыдущие отчеты не были изолированы в Mac OS X 10.6/10.7.
Скриншот процесса Пример из Activity Monitor:
Приветствуются любые подсказки или советы по отладке, чтобы выяснить, почему помощник застрял в _dyld_start!
DYLD_*
переменных среды. - person Ken Thomases   schedule 10.03.2013DYLD_
, если вы не устанавливаете их самостоятельно, смотрите в ~/.MacOSX/environment.plist. - person Peter Hosey   schedule 11.03.2013DYLD_
в следующий раз, когда получу доступ к машине. - person catlan   schedule 12.03.2013posix_spawn
для запуска приложения и указываете флагPOSIX_SPAWN_START_SUSPENDED
, особенно потому, что присоединение, а затем отсоединение gdb открепляет вещи. ОднакоNSTask
не используетposix_spawn
, если только не используется какая-то его модифицированная версия. - person bdash   schedule 20.03.2013DYLD_
могут иметь значение, учитывая, что процесс остановлен до того, какdyld
начал выполнение. - person bdash   schedule 21.03.2013sysdiagnose
, пока процесс находится в этом состоянии, то у него может быть достаточно информации, чтобы понять, как он туда попал. В противном случае у нас просто не будет достаточно информации, чтобы сделать что-то большее, кроме предположений о том, что вызывает проблему. - person bdash   schedule 21.03.2013