Ser*_*nov 11 c++ debugging visual-studio stack-corruption
现在我正在调试一个大型项目,它有一个堆栈损坏:应用程序失败.
我想知道如何使用Visual Studio 2010查找(调试)此类堆栈损坏代码?
下面是一些导致堆栈问题的代码示例,我如何找到这种类型腐败的不太明显的案例?
void foo()
{
int i = 10;
int *p = &i;
p[-2] = 100;
}
Run Code Online (Sandbox Code Playgroud)
请注意,这只是一个例子.我需要在当前项目中找到这样的错误代码.
有一种技术可以对这些类型的错误非常有效,但它只适用于具有一些特征的一部分:
请注意,乍一看似乎不太可能出现第二种情况,因为根据运行时操作,堆栈可以以多种不同的方式使用.但是,堆栈使用通常非常确定.问题是特定的堆栈位置可以用于许多不同的事情,问题实际上是项目#3.
无论如何,如果你的bug有这些特性,你应该识别出被破坏的堆栈地址(或其中一个),然后为写入该地址设置一个内存断点,条件是只有当写入的值是腐败的价值.在Visual Studio中,您可以通过在"断点"窗口中创建"新数据断点..."然后右键单击断点来设置条件来完成此操作.
如果最终得到太多的误报,可能有助于缩小断点的范围,方法是将其禁用,直到执行路径中的某个点更接近错误(如果您可以识别这样的时间),或设置命中计数足够高,以消除大多数误报.
另一个复杂因素是堆栈的地址可能会在运行之间发生变化 - 在这种情况下,您必须注意在每次运行时设置断点(地址的低位应该相同).
| 归档时间: |
|
| 查看次数: |
9957 次 |
| 最近记录: |