微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 调试堆栈损坏

现在我正在调试一个大的项目,它有一个堆栈损坏:应用程序失败.

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

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

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

更新

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

解决方法

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

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

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

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

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

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

原文地址:https://www.jb51.cc/c/113941.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐