首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用户断点无处可寻

用户断点无处可寻
EN

Stack Overflow用户
提问于 2008-12-22 02:01:11
回答 2查看 5.2K关注 0票数 7

我在MS VC++ 6.0中有一些正在调试的代码。由于某些原因,在我试图删除一些动态分配的内存时,它崩溃了,并且我得到了一个弹出的消息框,上面写着"User Breakpoint called from code from code at blah blah“。然后弹出反汇编窗口,我看到

代码语言:javascript
复制
*memory address* int      3

奇怪的是,我在代码中没有这样调用汇编指令的地方(我认为ASMint3是x86的硬件中断命令)。

这可能是什么原因造成的?

编辑:答案:我的代码是“走出”数组的末尾,但只在Visual Studio debug用0xFDFDFDFD标记的位置,这被称为诺曼的陆地栅栏。我认为这也被称为Off-by-one错误..这个数组与错误发生时我正在释放内存的点无关。这使得它更难被发现..:(

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-12-22 02:02:46

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

当你点击Int3时,调用堆栈是什么样子的?

编辑:根据您评论中的堆栈跟踪,例程_CrtIsValidHeapPointer()表明正在释放的指针是错误的。以下是MSVC的DBGHEAP.C源代码中的代码片段:

代码语言:javascript
复制
    /*
     * 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将是您要删除的指针的值。

票数 8
EN

Stack Overflow用户

发布于 2008-12-22 02:13:17

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

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

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

代码语言:javascript
复制
#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

请参见:

  • http://msdn.microsoft.com/en-us/library/45yd4tzz(VS.80).aspx
  • http://www.highprogrammer.com/alan/windev/visualstudio.html

所以我建议寻找一些宏或对象来做这件事,或者可能它附加在一个你没有代码的模块(dll/lib)中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/385370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档