NSTask子进程卡在_dyld_start中

时间:2013-03-10 15:27:26

标签: objective-c cocoa nstask dyld

我使用 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上非沙盒化。

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

Activity Monitor

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

1 个答案:

答案 0 :(得分:-1)

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

  • 崩溃转储中已加载库的列表(可能存在线索)
  • 子进程中发生的任何错误(在fork之后)。但是,我明白为什么回到任何post-fork错误都很困难。

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

  • 你确定它被卡住而没有崩溃吗?就用户所知,你的应用程序你的应用程序看起来不会崩溃。只有子进程才会崩溃。
  • 作为最后的手段,您可以尝试查找发生的任何马赫异常(如果 任何,这将意味着一个错误,你将无法做到 无论如何要恢复。但它仍将提供有价值的线索。
  • 您可以告诉愿意的定制者向您发送他们的sysdiagnose。
    为了达到这个目标,请他们点击 Command + Option + Control + + Shift 等待几分钟。不久之后,他们的查找器会弹出一个窗口,显示一个名为sysdiagnose_timestamp_.tar.gz的文件。请他们邮寄给你。我的大概是5 MB。有关sysdiagnose man page
  • 的更多详情