堆损坏或堆栈损坏
Heap Corruption or Stack corruption
由于某些问题,我的应用程序崩溃了。调用堆栈可用于崩溃。如何通过查看调用堆栈来知道崩溃是由于堆损坏还是堆栈损坏?
您可以使用 valgrind 来检查程序中的内存泄漏。
或者,更好的是,使用 ddd/gdb 逐步浏览并查看。无论哪种方式,如果不看一下 valgrind 输出,就很难知道。
通常,如果问题出在指针上,则可能是由于堆损坏。
呵呵,
斯里拉姆
看起来你发布了两次几乎相同的问题,可能不应该这样做。 由于您是在Windows环境中工作(我从您的另一篇文章中收集了它),因此当您的程序崩溃时,请获取一个转储文件(使用VS或adplus创建一个)。 获得文件后,将其加载到 windbg 中。 运行"!analyze -v"。 如果存在堆损坏,则会在分析报告中指示
。我见过太多次这样的情况,开发人员会盯着一个看起来很奇怪的崩溃,然后宣布,"因为我不知道它是什么,一定是堆损坏"。 当我帮助他们时(至少这是我的经验),有 4/5 次是一个简单的应用程序逻辑错误。
通过在 main 的开头放置以下行来使用 Windows 中的内置调试(如果使用 Win32):
_CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF|_CRTDBG_LEAK_CHECK_DF|_CRTDBG_CHECK_CRT_DF|
_CRTDBG_DELAY_FREE_MEM_DF |_CRTDBG_ALLOC_MEM_DF);
当出现问题时,这将中断。但是,我发现Microsoft的应用程序验证程序易于使用且非常有用。有时它会把我带到导致腐败的冒犯线。您需要从以下Microsoft下载应用程序验证程序:
http://www.microsoft.com/en-us/download/details.aspx?id=20028
然后在Windows\System32文件夹中安装并查找exe,调用appverif.exe。将其指向可执行文件,然后在调试中运行应用程序,就像通常在 Visual Studio 中一样。Visual Studio将在检测到问题的地方中断(真正的原因可能在其他地方,但如果你知道你的代码是做什么的,你应该知道发生了什么)。
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 变量周围的堆栈'sortArray'已损坏
- 变量周围的堆栈'folderPath'已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- 围绕变量的堆栈是损坏的 c++
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 数组变量周围的堆栈已损坏
- 运行时检查失败 - 变量周围的堆栈已损坏
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 调试:运行时检查失败 #2 - 变量"LoggerThread"周围的堆栈已损坏
- 将大双精度转换为无符号 int 期间堆栈损坏
- 运行时检查失败 #2 - 变量周围的堆栈'k'已损坏
- 运行时检查失败 #2 - 变量"数字选择"周围的堆栈已损坏
- 数组问题:变量周围的堆栈'arr'已损坏
- scanf int8_t损坏堆栈
- 如何在不损坏堆栈的情况下将 varargs 与__stdcall一起使用