2011-02-28 95 views
4

如何在我的代码中轻松找到触发此事件(即“程序接收信号:EXC_BAD_ACCESS”)的点?“程序接收信号:EXC_BAD_ACCESS” - 如何识别触发的线路?

当我得到这个,我看在控制台上,我没有看到任何额外的信息,如在这种情况下堆栈跟踪。我知道我可以在代码中加入断点,并尝试着手寻找,但是如果有一种方法可以更容易地找出没有很多断点的地方,那么将会很棒。

编辑1 - 重新键入回溯(重新这个答案),我看到这个,这似乎并没有突出我的代码中的点?

(gdb) backtrace 
#0 0x00fd7a63 in objc_msgSend() 
#1 0x06019780 in ??() 
#2 0x0046cf16 in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:]() 
#3 0x0046a9e7 in -[UITableViewRowData numberOfRows]() 
#4 0x003218c2 in -[UITableView noteNumberOfRowsChanged]() 
#5 0x0032e2b8 in -[UITableView reloadData]() 
#6 0x0032b470 in -[UITableView layoutSubviews]() 
#7 0x01d33451 in -[CALayer layoutSublayers]() 
#8 0x01d3317c in CALayerLayoutIfNeeded() 
#9 0x01d2c37c in CA::Context::commit_transaction() 
#10 0x01d2c0d0 in CA::Transaction::commit() 
#11 0x01d5c7d5 in CA::Transaction::observer_callback() 
#12 0x00e56fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() 
#13 0x00dec0e7 in __CFRunLoopDoObservers() 
#14 0x00db4bd7 in __CFRunLoopRun() 
#15 0x00db4240 in CFRunLoopRunSpecific() 
#16 0x00db4161 in CFRunLoopRunInMode() 
#17 0x017aa268 in GSEventRunModal() 
#18 0x017aa32d in GSEventRun() 
#19 0x002c342e in UIApplicationMain() 
+0

很简单:NSZombies。棘手的是SIGABRTs。 :( – 2011-02-28 00:37:01

回答

4

尝试在乐器中使用NSZombies。有关于如何使用它的Apple WWDC视频。这应该有助于确定它来自哪里。

+0

看着这个现在Ajay – Greg 2011-02-28 01:13:09

+0

现在使用这种方法 - 太棒了不是 - 谢谢 – Greg 2011-02-28 01:33:58

2

使用GDB的backtrace命令(在控制台中键入'backtrace')。这将打印整个堆栈直到崩溃。

More info here.

+0

嗨马特 - 我添加了一条评论,我的帖子重新这一个 - 它仍然没有指出我的代码关联点问题是什么? – Greg 2011-02-28 00:44:07

+0

好的,虽然你没有任何堆栈跟踪,但没有一个是模棱两可的,在这种情况下,正如其他评论者所说,NSZombies应该帮助你追踪这个问题。和NSZombies可以帮助你找到位置 – 2011-02-28 00:48:21

5

NSZombieEnabled将最有可能帮助您找到最过度释放错误。从CocoaDev

使用Xcode中:双击可执行文件组 您的Xcode项目中的可执行文件。单击参数选项卡。在“在环境中设置的变量为 ”部分中,创建一个名为 “NSZombieEnabled”的变量并将其值设置为“YES”。

对于特别恶劣的情况下(讨厌过自动释放错误在我的情况)一些额外的标志像NSDebugEnabled,MallocStackLogging和MallocStackLoggingNoCompact将帮助您检查任何变量的保留/释放历史。如何使用它们的教程可以在这里找到http://www.cocoadev.com/index.pl?DebuggingAutorelease

+0

感谢帮助ACBurk - 我得到以下 - 我不认为它告诉我们究竟在代码中究竟在哪里?(虽然额外的信息可以帮助我猜测它会在哪里)。以下是我看到的:“2011-02-28 10:53:48.595 myApp [99384:207] *** - [__ NSArrayM count]:发送到释放实例0x5b26150的消息”。所以我猜它可能是numberOfRowsInSection方法... – Greg 2011-02-28 00:58:42

1

有几件事你可以做,以追踪跟踪记忆体问题。

  1. 在某些情况下,您可以使用调试器。 命令 + + Ÿ

  2. 您可以使用NSZombieEnabled

  3. 您可以使用Build菜单中的“构建和分析”。

相关问题