2011-03-18 82 views
2

这是我以前的问题Application crash with no explanation的扩展。查找堆腐败

我有很多被推测在应用服务器上造成堆损坏崩溃。这些崩溃只发生在生产中;他们不能在测试环境中复制。

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

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

是否有任何其他工具,这将有助于找到堆损坏,而不增加巨大的开销?

回答

3

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

_CRTDBG_DELAY_FREE_MEM_DF可以查找内存使用,释放后的错误是非常有用的,但在使用它堆大小monitonically增长。

+0

这是一个很好的开始。我已经使用它一起使用Microsoft的应用程序验证程序,并能够找到我正面临的错误。 – 2012-11-28 19:56:19

1

会不会有在运行它的虚拟化,并采取计划的快照任何好处,让你希望可以得到一个快照只是一点点,它实际上崩溃过吗?然后采取预碰撞快照并在实验室环境中启动它。如果您可以让它再次崩溃,请重新启动快照并开始检查您的服务器进程。

+1

没有机会。这个崩溃在时间上并不一致,它完全是随机的。服务器可以在2小时到2周内运行,而不会发生这种情况。即使我们在崩溃前有一个快照,它也不会帮助我们找到发生堆损坏的地方。我们可以在发生崩溃时创建一个完整的过程转储,但它没用。 – 2011-03-18 14:31:27

+0

只要你能找到一种方法来拍摄自动快照,让它运行2周,如果这是需要的? – 2011-03-18 14:39:30

+0

我不认为你明白,快照是完全没用的。堆损坏已经发生。我需要赶上它,并找到它发生的地方。 – 2011-03-18 14:49:08

-1

Mudflap与海湾合作委员会。它为生产代码编写测试代码。
你必须用-fmudflap编译你的软件。它会检查任何错误的指针访问(堆/堆栈/静态)。它被设计用于生产代码,稍微放缓(在x1.5到x5之间)。您也可以在读访问时禁用检查以加速。

+0

此代码使用Visual Studio编译并在Windows上运行。它大量使用winapi。 – 2011-03-24 17:59:43

+0

...............太差 – log0 2011-03-24 21:16:23