我正在调试Objective-C ++中的EXC_BAD_ACCESS
,就像一个优秀的SO学生一样,我已将NSZombieEnabled
的环境变量设置为YES
。
我没有得到任何Zombies,只是在日志中(gdb)
,然后在我的代码的各种(C ++)行中EXC_BAD_ACCESS
。
问题:我使用Zombies是错误的,还是只是忽略了我项目中的C ++部分?
示例:
if (this->squares[i][j] == 1) // <-- EXC_BAD_ACCESS on this line. The array exists and shows up in the debugger... and i and j both exist and are 0.
堆栈:
Thread 1, Queue : com.apple.main-thread
#0 0x00009309 in Board::draw(float, float, float, float, float) at /Developer/of_007_iphone/apps/cwi007/iTicTacToe/src/gameplay/gameBoard.cpp:53
#1 0x0000a2f1 in SuperBoard::drawBig(float, float, float) ()
#2 0x000044b8 in testApp::draw() ()
#3 0x0020fc16 in ofAppiPhoneWindow::timerLoop() ()
#4 0x00218db9 in -[ofxiPhoneAppDelegate timerLoop] ()
#5 0x00ab1749 in __NSFireTimer ()
#6 0x01f898c3 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#7 0x01f8ae74 in __CFRunLoopDoTimer ()
#8 0x01ee72c9 in __CFRunLoopRun ()
#9 0x01ee6840 in CFRunLoopRunSpecific ()
#10 0x01ee6761 in CFRunLoopRunInMode ()
#11 0x027651c4 in GSEventRunModal ()
#12 0x02765289 in GSEventRun ()
#13 0x00d29c93 in UIApplicationMain ()
#14 0x002106e1 in ofAppiPhoneWindow::runAppViaInfiniteLoop(ofBaseApp*) ()
#15 0x002219ae in ofRunApp(ofBaseApp*) ()
#16 0x00002fd6 in main ()
答案 0 :(得分:1)
Zombies非常有用,因为当您向已解除分配的对象发送消息时,它们会在调试器中标记。但它们只能使用Objective-C代码。
EXC_BAD_ACCESS
错误很棘手,因为在它们发生的那一刻,该行代码可能与错误的根本原因无关。 可能提供线索。
这是因为当 all 驻留在特定内存块中的对象已被释放并且有资格进行释放时,Objective-C运行时将仅释放已释放的对象。
请点击此处查看有关如何追踪这些讨厌错误的精彩说明和说明:
答案 1 :(得分:0)
我会争辩“不”,因为实施NSZombieEnabled
的方式与-fobjc-call-cxx-cdtors
不相容。这意味着当对象从“live”转换为“zombie”时,具有解构函数的实例变量无法正确解构。在我的情况下(刚才),我收到了某人的报告,当我使用该技术进行调试时,我的项目在NSZombie
中止了,在查看问题时我将其追踪到一个自动清除的智能指针委托对依赖对象没有被运行时解构。