c – 调试堆栈损坏

前端之家收集整理的这篇文章主要介绍了c – 调试堆栈损坏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
现在我正在调试一个大的项目,它有一个堆栈损坏:应用程序失败.

我想知道如何使用Visual Studio 2010找到(调试)这样的堆栈损坏代码

以下是一些导致堆栈问题的代码的例子,我会如何找到不那么明显的这类腐败案例?

void foo()
{
    int i = 10;
    int *p = &i;
    p[-2] = 100;
}

更新

请注意,这只是一个例子.我需要在当前的项目中找到这样的坏代码.

解决方法

有一种技术可以对这些类型的错误非常有效,但它只适用于具有以下特征的一部分:

腐败的价值必须是稳定的(例如,在你的例子中,当腐败发生时,它始终是100),或者至少可以在一个简单的表达式中容易地识别出来
>腐败必须发生在堆栈上的特定地址
腐败的价值是非常不寻常的,你不会被一大堆的误报

请注意,第二个条件似乎不太可能乍一看,因为根据运行时操作,堆栈可以以许多不同的方式使用.然而,堆栈使用通常是非常确定的.问题是,特定的堆栈位置可以用于许多不同的事情,问题是真正的项目#3.

无论如何,如果您的错误具有这些特征,您应该识别被破坏的堆栈地址(或其中一个),然后为写入该地址设置一个内存断点,只有当写入的值为腐败的价值.在visual Studio中,您可以通过在“断点”窗口中创建“新建数据断点…”,然后右键单击断点来设置条件.

如果你最终得到太多的误报,那么这可能有助于缩小断点的范围,使其被禁用,直到执行路径中的某个点更接近错误(如果你可以识别这样的时间),或者设置命中计数高到足以消除大部分假阳性.

一个额外的复杂性是堆栈的地址可能会从运行变为运行 – 在这种情况下,您必须小心在每次运行时设置断点(地址的较低位应该相同).

猜你在找的C&C++相关文章