加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 调试堆栈损坏

发布时间:2020-12-16 05:42:54 所属栏目:百科 来源:网络整理
导读:现在我正在调试一个大的项目,它有一个堆栈损坏:应用程序失败. 我想知道如何使用Visual Studio 2010找到(调试)这样的堆栈损坏代码? 以下是一些导致堆栈问题的代码的例子,我会如何找到不那么明显的这类腐败案例? void foo(){ int i = 10; int *p = i; p[-2]
现在我正在调试一个大的项目,它有一个堆栈损坏:应用程序失败.

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

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

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

更新

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

解决方法

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读