c – 调试堆栈损坏
现在我正在调试一个大的项目,它有一个堆栈损坏:应用程序失败.
我想知道如何使用Visual Studio 2010找到(调试)这样的堆栈损坏代码? 以下是一些导致堆栈问题的代码的例子,我会如何找到不那么明显的这类腐败案例? void foo() { int i = 10; int *p = &i; p[-2] = 100; } 更新 请注意,这只是一个例子.我需要在当前的项目中找到这样的坏代码. 解决方法
有一种技术可以对这些类型的错误非常有效,但它只适用于具有以下特征的一部分:
腐败的价值必须是稳定的(例如,在你的例子中,当腐败发生时,它始终是100),或者至少可以在一个简单的表达式中容易地识别出来 请注意,第二个条件似乎不太可能乍一看,因为根据运行时操作,堆栈可以以许多不同的方式使用.然而,堆栈使用通常是非常确定的.问题是,特定的堆栈位置可以用于许多不同的事情,问题是真正的项目#3. 无论如何,如果您的错误具有这些特征,您应该识别被破坏的堆栈地址(或其中一个),然后为写入该地址设置一个内存断点,只有当写入的值为腐败的价值.在visual Studio中,您可以通过在“断点”窗口中创建“新建数据断点…”,然后右键单击断点来设置条件. 如果你最终得到太多的误报,那么这可能有助于缩小断点的范围,使其被禁用,直到执行路径中的某个点更接近错误(如果你可以识别这样的时间),或者设置命中计数高到足以消除大部分假阳性. 一个额外的复杂性是堆栈的地址可能会从运行变为运行 – 在这种情况下,您必须小心在每次运行时设置断点(地址的较低位应该相同). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 以编程方式设置WPF元素的Name属性
- 谈程序在RAM,FLASH 和外部RAM中运行的速度
- c# – 为什么Tuple或KeyValueItem没有setter?
- ruby – 如何从gem内部引用文件
- Do not hybrid compile and link source code by using VC
- TDD与VTDD系列(二):CppUnit的改进与使用(2)
- c – GCC,-O2和位域 – 这是一个bug还是一个功能?
- ReactiveCocoa基础
- ios – Xcode 9.3并更新到High Sierra:即使在完全重新安装
- iphone – Info.plist中的Bundle Identifier与App ID和iTun