坐在我的Dock中的Unkillable,伪造的NSRunningApplication?

时间:2014-09-03 15:54:05

标签: xcode cocoa nsworkspace nsrunningapplication

我在OSX 10.9.4上使用Xcode 5.1.1来调试Cocoa + OpenGL应用程序。到目前为止,我只在Xcode调试器下运行我的应用程序。上周我退出Xcode只是为了找到我的应用程序的图标仍然在Dock中。使用Show In Finder让我在Xcode的DerivedData中找到了一个调试可执行文件。我最终重新启动它以摆脱它(更多关于它)并且直到今天都很好。但我现在在我的Dock中有两个这些图标。

问题:这些应用无法被杀! Force Quit什么都不做。它们不会使用'ps aux'或Activity Monitor显示在进程列表中。重启刚刚陷入循环,试图摆脱它们。只有强行重启Mac才能正常工作。

根据NSWorkspace的runningApplication方法,有与这些应用程序关联的NSRunningApplication实例。但是进程ID与实际进程不对应。控制台日志中没有任何相关内容。

其他人遇到过这个吗?有关让NSWorkspace摆脱虚假NSRunningApplication实例的任何建议吗?

1 个答案:

答案 0 :(得分:1)

编辑: 我发现了问题的根本原因! “拥有”伪僵尸Dock NSRunningApplication的应用程序在迭代IOObjectRelease()的每个子节点后没有调用IORegistryEntryGetChildIterator()。 Gah这花了我几个月才最终追踪到这一点。 基本上我使用断点来对应用程序'伪僵尸化'其他应用程序'NSRunningApplication的确切时刻进行二进制搜索。 仍然不明白为什么IORegistry迭代会劫持NSRunningApplication。

这为我解决了这个问题:

sudo killall launchservicesd; sudo killall Dock; sudo killall Finder;

或.bashrc:

alias killdock="sudo killall launchservicesd; sudo killall Dock; sudo killall Finder;"

注意:如果你还没有杀死Finder,那么'在Finder中显示......'a.k.a。[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:urls];在我的应用程序中停止工作。