调试Visual C ++内存分配问题

时间:2009-04-23 13:55:13

标签: visual-c++ heap pageheap

我正在调试一个最终崩溃的软件,其中包含以下消息之一:

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对话框,要求我发送错误报告。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

您可以通过附加到Windbg以发布模式运行您的应用程序。

  • 启用gflags(和你一样) 提到的)
  • 在发布中启动应用程序 模式。
  • 使用Windbg中的Attach to process选项将其附加到Windbg。
  • 为其配置正确的路径 发布PDB。
  • 使用手动重新加载PDB .reload /f如果是自动的话 加载失败。
  • 执行用例。

WinDbg会在发生异常时停止执行。对于每个第一次机会异常,分析原因。这可能是崩溃的错误之一。

答案 1 :(得分:0)

在使用gFlags / PageHeap之前,我建议您检查访问冲突异常。首先使用Build-> Start Debug-> Attach to process选项附加该过程。一旦附加,启用访问冲突例外,方法是转到Debug-> Exceptions选择Access Violation并选中Stop Always复选框。然后检查调试器是否捕获任何访问冲突异常。