查找堆损坏

时间:2011-03-18 14:00:09

标签: c++ windows debugging heap-corruption

这是我之前的问题Application crash with no explanation的扩展。

我有很多崩溃,可能是由应用服务器上的堆损坏引起的。这些崩溃只发生在生产中;它们不能在测试环境中复制。

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

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

是否还有其他工具可以帮助查找堆损坏,而不会增加巨大的开销?

3 个答案:

答案 0 :(得分:3)

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

_CRTDBG_DELAY_FREE_MEM_DF对于查找内存使用后免费的错误非常有用,但是在使用它时,堆大小会逐渐增长。

答案 1 :(得分:1)

运行虚拟化和获取计划快照会有什么好处,这样您希望在实际崩溃之前获得快照吗?然后拍摄预碰撞快照并在实验室环境中启动它。如果您可以再次崩溃,请重新启动快照并开始检查服务器进程。

答案 2 :(得分:-1)

与GCC

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