我正在调试 MS VC++ 6.0 中的一些代码。出于某种原因,在我尝试删除一些动态分配的内存的某个时刻,它崩溃了,我收到一个弹出消息框,上面写着“从代码中调用的用户断点等等”。然后弹出反汇编窗口,我看到

*memory address* int      3

奇怪的是,代码中没有任何地方我调用这样的汇编指令(我认为 asm int 3 是 x86 的硬件中断命令?)..

可能是什么原因造成的?

编辑:回答:我的代码“走出数组的末尾”,但仅限于 Visual Studio 调试用 0xFDFDFDFD 标记的位置,这被称为 NoMan'sLand 栅栏。我认为它也称为“差一错误”。该数组与错误发生时我释放内存的点无关。这使得更难发现..:(

有帮助吗?

解决方案

你可能打码在已经发现堆损坏的调试堆例程。

这是什么调用堆栈看,当你打到INT 3样?

编辑:根据您的意见堆栈跟踪,日常_CrtIsValidHeapPointer()是说,被释放的指针是坏的。下面是从代码MSVC的DBGHEAP.C源代码段:

    /*
     * If this ASSERT fails, a bad pointer has been passed in. It may be
     * totally bogus, or it may have been allocated from another heap.
     * The pointer MUST come from the 'local' heap.
     */
    _ASSERTE(_CrtIsValidHeapPointer(pUserData));

pUserData将是您的delete一个指针的值。

其他提示

(我认为ASM int 3是x86的硬件断开命令?

这是。 它被称为 “硬件断点”. 。如果您将 VS 调试器与项目源代码一起使用,它就像一个断点(但在代码中)。从 vs2005 开始,如果您的应用程序在没有任何调试器的情况下启动,应用程序将直接崩溃,就像它启动了非托管异常一样。

在很多公司中,都有一个简单的宏用于在代码中添加断点。这可以在某些(困难和罕见)情况下替换断言和异常:

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

看 :

所以我建议寻找一些宏或对象来执行此操作,或者它可能发生在您没有代码的模块(dll/lib)中?

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