NSTask子进程卡在_dyld_start中

cat*_*lan 5 cocoa objective-c dyld nstask

我使用NSTask来运行我的帮助应用程序.99%的我的客户系统一切正常,但有两个回到我这让我知道它没有.其中一个非常好,让我可以调查每个远程桌面的问题.

我为StandardOutput/StandardError 尝试了很多不同的NSPipe/NSFileHandle组合,以确保问题与填充这些缓冲区无关.例1和2.我的猜测是它没有相关性,因为它在很多系统上工作正常,并且_dyld_start在应用程序生命周期中为时尚早,以填满StandardOutput/StandardError.

关于这个问题的其他说明:

  • 从终端启动帮助应用程序工作正常.
  • 在卡住的进程上附加和分离gdb并且值得工作正常并且当它完成时NSTask在-waitUntilExit之后接收工作.
  • 使用fork(2)和execv(3)而不是NSTask能够启动并运行帮助程序.
  • 父进程是沙盒,但我认为之前的报告在Mac OS X 10.6/10.7上进行了非沙盒处理.

活动监视器中的过程示例的屏幕截图:

活动监视器

任何线索或调试技巧,以确定帮助器卡在_dyld_start中的原因是受欢迎的!

Jea*_*ean -1

既然没有人回答,我就提出一些想法。也许其中之一是答案 \xe2\x80\x93 只是猜测 \xe2\x80\x93 但由于欢迎线索和提示,你可以看一下:

\n\n
    \n
  • 故障转储中已加载库的列表(那里可能有线索)
  • \n
  • 子进程中(分叉之后)发生的任何错误。然而,我明白为什么很难恢复任何分叉后错误。
  • \n
\n\n

如果我没记错的话, NSTask 会调用posix_spawn(2). 这可能是一个线索,因为使用fork(2)andexecv(3)似乎有效,您可以关注NSTask和 非阻塞替代方案之间的差异。显然,一开始就发生了一些事情,阻碍了孩子的正常执行。

\n\n
    \n
  • 您确定它被卡住并且没有崩溃吗?据用户所知,您的应用程序看起来不会崩溃。只有子进程会崩溃。
  • \n
  • 作为最后的手段,您可以尝试查找发生的任何 Mach 异常(如果有任何异常,则意味着出现错误,无论如何您都无法恢复该错误。但它仍然会提供有价值的线索)。
  • \n
  • 您可以告诉愿意的客户向您发送他们的系统诊断。
    为了这个目标,请他们点击+++Command等待Option几分钟。不久之后,他们的查找器应该会弹出一个窗口,显示一个名为:. 请让他们邮寄给您。我的大约是5MB。有关sysdiagnose 手册页的更多详细信息。Control.Shiftsysdiagnose_timestamp_.tar.gz
  • \n
\n