2011-08-31 135 views
1

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

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

参见[如何调试堆损坏错误?(http://stackoverflow.com/questions/1010106/how-to-debug-heap-corruption-errors)的一些相关的有用信息 – Justin

回答

0

错误来自原生DLL,它有缺陷或被滥用。要找出哪一个,您可以使用Process Explorer来检查消息弹出时应用程序线程的堆栈跟踪。该DLL将围绕堆栈的顶部(该消息箱的东西将在它之上)。但是,您不会看到损坏的根源 - 当内存被释放时检测到错误。

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

BTW,AFAIK,这些消息只出现在调试版本上,这意味着本机DLL在调试版本中。如果是第三方的话,那会很奇怪。如果是你的,你可以在调试过程中附加一个调试器,并且在消息弹出时它会中断。你仍然没有得到错误的根源,但你会对上下文有更好的了解。

+0

“如果你的堆被破坏,你的数据也可能会被破坏。“根据我的经验,堆腐败几乎总是非常迅速地导致程序在一堆(il-)逻辑中被击倒。唯一比堆腐败更糟糕的是堆栈损坏(或损坏的代码,但这是非常罕见的)。 –

+0

@个人,一般来说,你可以认为自己注定会发生这种情况,当然。在实践中,由于调试堆在块前后使用额外的字节来检测这些问题,所以如果溢出次数较小(然后在发布版本中,实际上会丢失数据,而不会出现错误)客户的网站)。我不知道这是为什么DLL在调试版本中... – eran