发现堆腐败
这是我以前的问题的延伸,应用程序崩溃没有解释。
我有很多崩溃,这大概是由应用程序服务器上的堆损坏引起的。 这些崩溃只发生在生产中; 他们不能在测试环境中复制。
我正在寻找一种方法来追踪这些崩溃。
应用程序验证器被建议,它会很好,但它对我们的生产服务器无法使用。 当我们尝试使用应用程序验证程序在生产环境中启动它时,即使这是一个相当强大的服务器(64位应用程序,16 GB内存,8个处理器),它变得非常缓慢以至于完全无法使用。 在没有应用程序验证程序的情况下运行它,它仅使用大约1 GB的内存,并且不超过任何处理器周期的10-15%。
有没有其他工具可以帮助查找堆腐败,而不会增加巨大的开销?
使用Microsoft运行时库的调试版本。 打开红色分区并通过在初始化过程中调用_CrtSetDbgFlag()
每隔128(堆)操作自动检查堆。
_CRTDBG_DELAY_FREE_MEM_DF
对于寻找内存使用后的错误非常有用,但是在使用它的时候,你的堆的大小是单调增长的。
在运行虚拟化和定时快照时会有什么好处,所以希望能够在实际崩溃之前获得快照吗? 然后采取预碰撞快照并在实验室环境中启动它。 如果您可以让它再次崩溃,请重新启动快照并开始检查您的服务器进程。
与GCC的Mudflap。 它为生产代码编写测试代码。
你必须用-fmudflap
编译你的软件。 它会检查任何错误的指针访问(堆/堆栈/静态)。 它被设计用于生产代码,稍微放缓(在x1.5到x5之间)。 您也可以在读访问时禁用检查以加速。