我们开发的产品之一是用 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 下调试时,调试器应该在导致恐慌的行上中断,并且您应该能够看到无效的删除。

其他提示

作为 卡斯普尔佐尔指出, ,单步执行调试器应该可以让您缩小到导致恐慌的行或例程集。您可能还想确保您不会尝试删除其所有权已转移到另一个堆对象(可能通过未明确记录这一事实的方法调用)的堆对象,该对象在显式删除之前已经删除了该对象。我以前也被后者咬过。

我模糊的理解是 USER 44 和 USER 45 恐慌都与堆问题有关。最常见的问题是双重删除。删除指针后是否将其置空?您在删除它们之前是否检查过 NULL?你可以在哪里双重删除某些东西?

最简单的调试选择可能是使用 Carbide 2.0,因为它功能齐全且免费。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top