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

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前/页堆,我建议你检查访问冲突异常。首先通过建设 - >启动调试 - 附加过程>附加到进程选项。一旦连接通过将调试 - >例外选择访问冲突,并选中该复选框停止常使访问冲突异常。然后检查你的调试器是否捕捉任何访问冲突异常。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top