堆腐败或堆栈损坏

时间:2011-05-08 03:50:05

标签: c++ memory-management crash

由于某些问题,我的应用程序崩溃了。调用堆栈可用于崩溃。如何通过查看调用堆栈来了解崩溃是由于堆损坏还是堆栈损坏?

3 个答案:

答案 0 :(得分:1)

您可以使用valgrind检查程序中的内存泄漏。

或者,更好的是,使用ddd / gdb逐步查看。无论哪种方式,如果不看一下valgrind输出就很难知道。

通常,如果问题出在指针上,那可能是因为堆损坏了。

HTH,
Sriram

答案 1 :(得分:0)

看起来你两次发布几乎相同的问题,可能不应该这样做。由于您在Windows环境中工作(我从您的其他帖子收集),当您的程序崩溃时,获取转储文件(使用VS或adplus创建一个)。获得文件后,将其加载到windbg中。运行“!analyze -v”。如果您有堆损坏,那么它将作为分析报告的一部分显示。

当开发人员盯着看起来很奇怪且只是声明的崩溃时,我已经看过太多次,“因为我不知道它是什么必须是堆腐败”。这是我帮助他们的4/5次(至少这是我的经验),这是一个简单的应用程序逻辑错误。

答案 2 :(得分:0)

在Windows中使用内置调试,将以下行放在main的开头(如果使用Win32):

_CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF|_CRTDBG_LEAK_CHECK_DF|_CRTDBG_CHECK_CRT_DF|
         _CRTDBG_DELAY_FREE_MEM_DF |_CRTDBG_ALLOC_MEM_DF);

当出现问题时,这将会中断。但是,我发现Microsoft的Application Verifier易于使用且非常有用。有时它会把我带到导致腐败的违规行。您需要从Microsoft下载应用程序验证程序:

http://www.microsoft.com/en-us/download/details.aspx?id=20028

然后在Windows \ System32文件夹中安装并查找exe,调用appverif.exe。 将它指向您的可执行文件,然后像在Visual Studio中一样在调试中运行您的应用程序。 Visual Studio将打破检测到问题的位置(真正原因可能在其他地方,但如果你知道你的代码是什么,你应该知道发生了什么)。