如何找到应用程序关闭时崩溃的原因?

How to find reason for app crash on close?

我的 Qt5 应用程序在我关闭时崩溃 window 返回:

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 中找到一些东西吗?

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

From what has been returned the problem is obvious, there is pointer somewhere being deleted (at least) two times. But were is this thing hiding?

不完全是;您所说的内容通常表示为 "double free";这似乎更像是有人将从未来自 malloc.

的东西传递给 free

要查明它,请按照消息所述进行操作:

*** set a breakpoint in malloc_error_break to debug.

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

一旦遇到断点,沿着调用堆栈向上走,看看哪个指针被释放,并尝试找出它实际上并非来自 malloc 时被释放的原因。

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

此外,运行ning valgrind 从来没有坏处,但我怀疑在这种情况下它是否有任何帮助 - 你似乎没有处理无效指针(它会在首先 read/write),但是你有一个有效的非堆分配指针,它被错误地用 free 解除分配。它可能会在 free 本身的同时检测到它。