在托管服务中检测到CRT调试堆损坏

时间:2011-08-31 07:41:28

标签: c# c++ windows debugging

我在C#Windows服务应用程序中收到CRT 检测到堆损坏消息框。 我找不到堆损坏的来源,即使我在发布模式下编译,消息框也会一直显示。 堆损坏可能是我的服务使用的一个非托管DLL文件(但我不知道在哪里)。

  1. 如何找到问题的根源?
  2. 如何禁用消息框?

2 个答案:

答案 0 :(得分:1)

使用Gflags.exePageheap.exe运行您的计划。这将帮助您陷入腐败发生的地方。

答案 1 :(得分:0)

错误来自本机DLL,它有缺陷或被滥用。要找出哪一个,您可以使用Process Explorer检查弹出消息时应用程序线程的堆栈跟踪。 DLL将位于堆栈的顶部(消息框内容将位于其上方)。但是,您不会看到损坏的根源 - 在释放内存时会检测到错误。

您可以使用one of these options禁用该消息,但您只能隐藏该问题。如果您的堆被破坏,您的数据也可能会被破坏。

BTW,AFAIK,这些消息仅出现在调试版本中,这意味着本机DLL处于调试版本中。如果它是某些第三方,那将是奇怪的。如果是你的,你只需将一个调试器附加到进程,它就会在弹出消息时中断。你仍然没有得到错误的根源,但你会更好地了解上下文。