我们开发的产品之一是用 C++ 和 Symbian 为诺基亚手机开发的手机应用程序,不久前我们开始出现“随机”崩溃,并出现 USER 44 恐慌。
我对 symbian 环境还很陌生,所以我正在寻找工具和建议来帮助找到这个错误的根源。
我可以获得等效的“堆栈跟踪”吗?是否有通用的恐慌代码可以让我对此有所了解?
来自http://www.symbian.com/developer/techlib/v9.1docs/doc_source/reference/N10352/UserPanics.html:
This panic is raised by the Free() and FreeZ() member functions of an RHeap.
It is caused when the cell being freed overlaps the next cell on the free
list (i.e. the first cell on the free list with an address higher than the
one being freed).
这意味着,您使用无效指针调用 delete/delete[](这反过来将调用 Free()/FreeZ())。在 Carbide 下调试时,调试器应该在导致恐慌的行上中断,您应该能够看到无效的删除。
正如Kasprzol 指出的那样,单步调试器应该可以让您缩小到导致恐慌的行或例程集。您可能还想确保您没有尝试删除一个堆对象,该堆对象的所有权已转移到另一个堆对象(可能是通过没有明确记录这一事实的方法调用),该对象在显式删除之前已经删除了该对象. 我以前被后者咬过。
我的模糊理解是 USER 44 和 USER 45 恐慌都与堆问题有关。最常见的问题是双重删除。删除指针后,您是否将指针归零?你在删除它们之前检查 NULL 吗?你在哪里可以双重删除一些东西?
最简单的调试选择可能是使用 Carbide 2.0,因为它功能齐全且免费提供。