如何在关闭时查找应用崩溃的原因?

时间:2016-07-03 14:04:58

标签: c++ qt c++11 qt5 qt-creator

当我点击关闭窗口返回时,我的Qt5应用程序崩溃了:

MyApp(28741,0x7fff7aa73000) malloc: *** error for object 0x7fc40bc8e300: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
The program has unexpectedly finished.

我想,恢复它的经典方法是系统地禁用应用程序模块(我应该说它的一部分,当事情没有那么好组织时),直到问题出现。

是否有一些(更)智能的方法来解决这个问题?

从返回的内容看问题很明显,指针某处被删除(至少)两次。但这件事隐藏了吗?

28741,0x7fff7aa73000该怎么办?和0x7fc40bc8e300?我可以使用它们在Mac上的Qt Creator 4中找到一些东西吗?

因为关闭时应用程序崩溃意味着问题出在析构函数中?

1 个答案:

答案 0 :(得分:2)

  

从返回的内容看问题很明显,指针某处被删除(至少)两次。但这件事隐藏了吗?

不完全;你所说的通常是“免费”的信号;这似乎更像是有人传递给free来自malloc的东西。

要确定它,请按照消息说明:

  

***在malloc_error_break中设置断点以进行调试。

(或者实际上,甚至只是在调试器下运行它;通常在Linux上它会在程序中止时进入堆栈顶部的调试器

一旦断点被​​击中,走向调用堆栈并查看正在释放的指针,并尝试找出当它实际上不是来自malloc时它被释放的原因。

地址“大”(0x7fc40bc8e300)的事实告诉它可能来自堆栈(如果OS X类似于Linux,堆在内存中“堆栈”,堆栈位于相反的一侧虚拟地址空间),所以可能它就像有人传递给freedelete来自堆栈的地址一样简单。当您错误地将堆栈分配的对象传递给某个想要获取其所有权的方法并且在不再需要时使用freedelete将其释放时,通常会发生这种情况。

此外,运行valgrind永远不会伤害,但我怀疑在这种情况下它可以有任何帮助 - 你似乎没有处理无效指针(它会在第一次读/写时检测到),但是您有一个有效的非堆分配指针,该指针被free错误地取消分配。它可能会在free本身的同时检测到它。