获取随机 SIGTRAP 信号(在 MinGW-gdb 中)是否是内存损坏的迹象?

问题描述 投票:0回答:2

我编写了自己的引用计数内存管理器 C++(为了好玩),我确信它并不完美;)。现在,当我尝试使用它时,我收到了随机的 SIGTRAP 信号。如果我注释掉与内存管理器相关的每一行,一切都会正常运行。使用 SIGTRAP-s 而不是 SIGSEGV 是很奇怪的。 我知道当程序遇到断点但没有设置断点时会抛出 SIGTRAP-s。我在另一个线程中读到,exe 和 dll 的调试版本必须是最新的。它们是最新的,所以这不是原因。

有谁知道为什么会这样吗?

c++ windows memory-management gdb mingw
2个回答
6
投票

在 Google 上搜索后,我意识到这些 sigtraps 与 MSVC++ 中收到的警告相同,即“Windows 已在 xxxx.exe 中触发了断点。这可能是由于堆损坏,并表明存在错误等等”。 .

看来是的,意外的签名陷阱可能表明内存损坏(很奇怪......)

我也发现了我的错误。 MM 位于链接到 dll 的静态库中。该静态库和 dll 链接到我的 exe。所以有两个内存管理器,一个在我的 exe 中,一个在我的 dll 中。如果调用MM的初始化方法。它在我的 exe 中初始化了 MM,但没有在 dll 中初始化,因此 dll 没有 init。我通过不将我的 exe 链接到该静态库来解决这个问题。


2
投票

我猜测您可能会调用不匹配的 new/delete 或 malloc/free 实现 - 因此内存管理器分配了一些东西,但是当内存被释放时,您最终会得到默认的删除/释放实现。

在信号上设置一个断点,看看堆栈上是否有 free() 或运算符删除,以及这是否是您期望的所述函数的实现。

© www.soinside.com 2019 - 2024. All rights reserved.