我使用 NSTask 来运行我的助手应用程序。在 99% 的我的客户系统上,这工作正常,但有两个回复我告诉我它没有。其中一个非常好,让我可以查看每个远程桌面的问题。

我为 StandardOutput/StandardError 尝试了很多不同的 NSPipe/NSFileHandle 组合,以确保问题与填充这些缓冲区无关。示例 12 。我的猜测是它不相关,因为它在这么多系统上都可以正常工作,而且 _dyld_start 在应用程序生命周期中还为时过早,无法填充 StandardOutput/StandardError。

关于该问题的其他说明:

  • 从终端启动助手应用程序工作正常。
  • 在卡住的进程上附加和分离 gdb 并且它工作正常,当它完成时 NSTask 在 -waitUntilExit 之后开始工作。
  • 使用 fork(2) 和 execv(3) 而不是 NSTask 能够很好地启动和运行帮助程序。
  • 父进程是沙盒的,但我认为以前的报告在 Mac OS X 10.6/10.7 上没有沙盒。

  • 来自事件监视器的流程示例的屏幕截图:



    欢迎提供任何线索或调试提示,以找出帮助程序卡在 _dyld_start 中的原因!

    最佳答案

    由于没有人回答,我抛出一些想法。也许其中一个是答案——只是猜测——但由于欢迎提供线索和提示,你可以看看:

  • 故障转储中已加载库的列表(可能有线索)
  • 子进程中(fork 之后)发生的任何错误。但是,我明白为什么很难恢复任何 fork 后的错误。

  • 如果我没记错的话, NSTask 会调用 posix_spawn(2) 。这可能是一个线索,因为使用 fork(2)execv(3) 似乎有效,您可以关注 NSTask 和非阻塞替代方案之间的差异。显然,一开始就发生了一些事情,阻止了 child 正确执行。
  • 您确定它被卡住了并且没有崩溃吗?据用户所知,您的应用程序看起来不会崩溃。只有子进程会崩溃。
  • 作为最后的手段,您可以尝试查找发生的任何 Mach 异常(如果
    任何,这将意味着一个错误,你将无法
    无论如何要恢复。但它仍然会提供有值(value)的线索)。
  • 您可以告诉愿意的客户向您发送他们的系统诊断信息。为了这个目标,让他们点击 Command + Option + Control + 。 + Shift 等待几分钟。不久之后,他们的发现者应该弹出一个窗口,显示一个名为: sysdiagnose_timestamp_.tar.gz 的文件。请让他们邮寄给您。我的是大约 5 MB。有关 sysdiagnose man page 的更多详细信息。
  • 关于objective-c - NSTask 子进程卡在 _dyld_start,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15323886/

    10-13 04:00