发现堆腐败

这是我以前的问题的延伸, 应用程序崩溃没有解释 。

我有很多崩溃,大概是由应用程序服务器上的堆损坏引起的。 这些崩溃只发生在生产中; 他们不能在testing环境中复制。

我正在寻找一种方法来追踪这些崩溃。

应用程序validation程序被build议,它会很好,但它是无法使用我们的生产服务器。 当我们尝试使用应用程序validation程序在生产环境中启动它时,即使这是一个相当强大的服务器(64位应用程序,16 GB内存,8个处理器),它变得如此之慢以至于完全无法使用。 在没有应用程序validation的情况下运行它,它只使用大约1 GB的内存,不超过任何处理器周期的10-15%。

有没有其他工具可以帮助查找堆腐败,而不会增加巨大的开销?

使用Microsoft运行时库的调试版本。 打开红色分区,并通过在初始化期间调用_CrtSetDbgFlag()一次,每128(堆)操作自动检查堆。

_CRTDBG_DELAY_FREE_MEM_DF对于寻找内存使用后的错误非常有用,但是在使用它的时候,你的堆的大小是单调增长的。

运行虚拟化和定时快照会有什么好处,所以希望在实际崩溃之前能够获得快照吗? 然后采取预先崩溃的快照,并在实验室环境中启动它。 如果您可以再次崩溃,请重新启动快照并开始检查您的服务器进程。

与GCC的Mudflap 。 它代码生产代码的仪器。
你必须用-fmudflap编译你的软件。 它将检查任何错误的指针访问(堆/堆栈/静态)。 它被设计用于生产代码有一点放缓(在x1.5到x5之间)。 您也可以在读取访问时禁用检查以加速。