7

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

*memory address* int      3

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

是什么原因造成的?

编辑:回答:我的代码是“离开数组的末端”,但仅在 Visual Studio 调试标记的位置中使用 0xFDFDFDFD,称为 NoMan'sLand 围栏。我认为它也称为 Off-by-一个错误..这个数组与我在发生错误时释放内存的点无关。这使得它更难被发现.. :(

4

2 回答 2

8

您可能在调试堆例程中遇到了发现堆损坏的代码。

当您点击 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将是您要删除的指针的值。

于 2008-12-22T02:02:46.033 回答
3

(我认为 asm int 3 是 x86 的硬件中断命令?

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

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

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

看 :

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

于 2008-12-22T02:13:16.540 回答