调试 Visual C++ 内存分配问题
-
13-09-2019 - |
题
我正在调试一个软件,该软件最终崩溃并显示以下消息之一:
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 上编写的。我们猜测这是某种缓冲区溢出,因此我们正在尝试找到方法来检测它发生的位置。
我找到了有关的信息 页堆 (这似乎能够告诉我我想要什么)和 GF标志, ,但似乎我无法让它发挥作用。
我创建了一个测试程序:
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 资源管理器),这会导致相同的错误。
然后我尝试编译release版本,并通过Visual C++ 6.0界面运行它,得到错误:
User breakpoint called from code at 0x7c90120e
从 Windows 资源管理器中,我刚刚收到 Windows 对话框,要求我发送错误报告。
我缺少什么?
解决方案
您可以通过附加到以发布模式运行您的应用程序 风数据库.
- 启用
gflags
(如您提到的) - 以发布模式启动应用程序。
- 使用以下命令将其附加到 Windbg
Attach to process
Windbg 中的选项。 - 配置发布PDB的正确路径。
- 使用手动重新加载 PDB
.reload /f
如果自动加载失败。 - 执行用例。
每当发生异常时WinDbg就会停止执行。对于每一个第一次机会异常,分析原因。这可能是崩溃的错误之一。
其他提示
使用GFLAGS前/页堆,我建议你检查访问冲突异常。首先通过建设 - >启动调试 - 附加过程>附加到进程选项。一旦连接通过将调试 - >例外选择访问冲突,并选中该复选框停止常使访问冲突异常。然后检查你的调试器是否捕捉任何访问冲突异常。
不隶属于 StackOverflow