我正在调试一个最终崩溃的软件,其中包含以下消息之一:
1. DAMAGE: after normal block (#24729280) at 0x00D710E0
2. Debug Assertion Failed
Program: D:\Soft\Test.exe
File: dbgheap.c
Line: 1017
Expression: _BLOCK_TYPE_IS_VALID(phead->nBlockUse)
这个软件真的很旧,但现在改变它不是一个选择。它是在Visual C ++ 6.0上编写的。我们猜测它是某种缓冲区溢出,所以我们试图找到检测它发生位置的方法。
我找到了有关PageHeap(似乎能够告诉我我想要的内容)和GFlags的信息,但似乎无法让它发挥作用。
我创建了一个测试程序:
char* test;
test = new char[5];
test[5] = 'a';
delete[] test;
引发错误:
DAMAGE: after normal block (#55) at 0x1671920
然后,我尝试通过运行:
将PageHeap附加到它gflags.exe /p /enable MemoryTest.exe /full
然后重新运行它(通过Visual C ++ 6.0界面和通过Windows资源管理器),这导致了相同的错误。
然后我尝试编译发布版本,并通过Visual C ++ 6.0接口运行它以获取错误:
User breakpoint called from code at 0x7c90120e
从Windows资源管理器中,我得到了Windows对话框,要求我发送错误报告。
我错过了什么?
答案 0 :(得分:1)
您可以通过附加到Windbg以发布模式运行您的应用程序。
gflags
(和你一样)
提到的)Attach to
process
选项将其附加到Windbg。.reload /f
如果是自动的话
加载失败。WinDbg会在发生异常时停止执行。对于每个第一次机会异常,分析原因。这可能是崩溃的错误之一。
答案 1 :(得分:0)
在使用gFlags / PageHeap之前,我建议您检查访问冲突异常。首先使用Build-> Start Debug-> Attach to process选项附加该过程。一旦附加,启用访问冲突例外,方法是转到Debug-> Exceptions选择Access Violation并选中Stop Always复选框。然后检查调试器是否捕获任何访问冲突异常。