0

我正在调试一个最终崩溃并显示以下消息之一的软件:

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

我错过了什么?

4

2 回答 2

1

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

  • 启用 gflags(如您所述)
  • 以发布模式启动应用程序。
  • Attach to process使用 Windbg 中的选项将其附加到Windbg。
  • 为发布 PDB 配置正确的路径。
  • .reload /f如果自动加载失败,请手动重新加载 PDB 。
  • 执行用例。

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

于 2009-04-23T14:44:51.627 回答
0

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

于 2009-04-23T14:17:14.127 回答