Xcode“来自debugging器的消息:获得了对k数据包的意外响应:OK”

在模拟器上testing我的应用程序时,我收到了这条消息:

来自debugging器的消息:获得了对k数据包的意外响应:OK

这是什么意思,是我的应用程序在任何危险?

使用Xcode 6.4和7.2

如果您查看llvm源代码中的ProcessGDBRemote.cpp文件,您会发现在Xcode的debugging程序发生意外的响应时(如果数据包不是'W''X'字符),会发生这种情况:

 Error ProcessGDBRemote::DoDestroy () { // ... if (m_gdb_comm.SendPacketAndWaitForResponse("k", 1, response, send_async) == GDBRemoteCommunication::PacketResult::Success) { char packet_cmd = response.GetChar(0); if (packet_cmd == 'W' || packet_cmd == 'X') { // ... } else { if (log) log->Printf ("ProcessGDBRemote::DoDestroy - got unexpected response to k packet: %s", response.GetStringRef().c_str()); exit_string.assign("got unexpected response to k packet: "); exit_string.append(response.GetStringRef()); } // ... SetExitStatus(exit_status, exit_string.c_str()); StopAsyncThread (); KillDebugserverProcess (); return error; } 

在这种情况下,debugging器发送string"OK"而不是"W""X" 。 没有什么可以做的,在Xcode背后有一个问题。 我发现,在重新连接到debugging会话之前,杀死Xcode的debugging进程,重新启动Xcode以及重新启动计算机可以解决此问题。

要了解更多关于OS X本地进程的信息,请查看嵌套if语句中的注释:

 // For Native processes on Mac OS X, we launch through the Host Platform, then hand the process off // to debugserver, which becomes the parent process through "PT_ATTACH". Then when we go to kill // the process on Mac OS X we call ptrace(PT_KILL) to kill it, then we call waitpid which returns // with no error and the correct status. But amusingly enough that doesn't seem to actually reap // the process, but instead it is left around as a Zombie. Probably the kernel is in the process of // switching ownership back to lldb which was the original parent, and gets confused in the handoff. // Anyway, so call waitpid here to finally reap it. 

有关为什么会发生此错误的有用评论:

 // There is a bug in older iOS debugservers where they don't shut down the process // they are debugging properly. If the process is sitting at a breakpoint or an exception, // this can cause problems with restarting. So we check to see if any of our threads are stopped // at a breakpoint, and if so we remove all the breakpoints, resume the process, and THEN // destroy it again. // // Note, we don't have a good way to test the version of debugserver, but I happen to know that // the set of all the iOS debugservers which don't support GetThreadSuffixSupported() and that of // the debugservers with this bug are equal. There really should be a better way to test this! // // We also use m_destroy_tried_resuming to make sure we only do this once, if we resume and then halt and // get called here to destroy again and we're still at a breakpoint or exception, then we should // just do the straight-forward kill. // // And of course, if we weren't able to stop the process by the time we get here, it isn't // necessary (or helpful) to do any of this. 

这是Xcode“表演”。 我也得到了一次,通过在terminal运行这个修复它:

 rm -rf ~/Library/Developer/Xcode/DerivedData/* ~/Library/Caches/com.apple.dt.Xcode/* 

基本上清除Xcodecaching和派生的数据,有时会损坏。 希望对你有效。