visual-studio-2010 - C 函数调用中的堆栈溢出 - MS Visual C++ 2010 Express

标签 visual-studio-2010 function overflow stack-overflow

我用 C 语言编写了一个函数,当调用该函数时,会立即导致堆栈溢出。

原型(prototype):void dumpOutput( Settings *, char **, FILE * );
来电线路:dumpOutput( stSettings, sInput, fpOut );
在调用它时,stSettings已经是指向 Settings 的指针结构, sInput是一个动态分配的二维数组和fpOutFILE * .它一直到达调用行,没有任何错误,没有内存泄漏等。

实际函数相当冗长,我认为它不值得在这里分享,因为溢出发生在代码进入函数时(我认为称为序言部分)

我试过直接从 main() 调用相同的函数使用虚拟变量检查传递的参数是否有任何问题,但它仍然会引发堆栈溢出条件。

错误来自 chkstk.asm当函数被调用时。这个 asm 文件(根据其中的注释)试图探测堆栈以检查/分配被调用函数的内存。它只是不断跳到Find next lower page and probe部分直到发生堆栈溢出。
dumpOutput 中的局部变量也不是内存野兽,只有 6 个整数和 2 个指针。

代码在进入该函数时使用的内存为 60,936K,在发生堆栈溢出时增加到 61,940K。大部分内存进入 sInput .这是错误的原因吗?我不这么认为,因为只有它的指针被传递。其次,我不明白为什么dumpOutput试图在堆栈上分配 1004K 的内存?

我在这里完全不知所措。任何帮助将不胜感激。

提前致谢。

最佳答案

按照设计,_chkstk() 的工作是生成堆栈溢出异常。您可以通过查看生成的机器代码来诊断它。进入函数后,右键单击编辑窗口,然后单击 Go To Disassembly。你应该看到类似这样的东西:

003013B0  push        ebp  
003013B1  mov         ebp,esp 
003013B3  mov         eax,1000D4h                  ; <== here
003013B8  call        @ILT+70(__chkstk) (30104Bh) 

通过 EAX 寄存器传递的值很重要,它是函数所需的堆栈空间量。 Chkstk 然后通过探测堆栈页面来验证它实际上是否可用。如果您看到它反复循环,则代码中 EAX 的值很高。像我的一样,它保证消耗堆栈的所有字节。和更多。这是它所保护的,您通常会遇到访问冲突异常。但是不能保证,您的代码可能会意外写入属于堆的映射页面。这将产生一个非常难以诊断的错误。 Chkstk() 可帮助您在沮丧中发现这些错误。

我只是用这个小测试功能做到了:
void test()
{
    char kaboom[1024*1024];
}

我们看不到您的,但异常表明您有一个大数组作为局部变量,或者您将一个大值传递给 _alloca()。通过从堆中分配该数组来修复。

关于visual-studio-2010 - C 函数调用中的堆栈溢出 - MS Visual C++ 2010 Express,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9127764/

相关文章:

c# - 了解 .NET 框架的 future

visual-studio-2010 - 每次重新启动后 Visual Studio 2010 "cannot find"C :\Users\[USERNAME]\AppData\Local\Temp\1\. NETFramework,Version=v4.0.AssemblyAttributes.vb

r - 将字符元素添加到数值矩阵

css - 垂直 CSS 菜单与溢出冲突 :hidden?

css - 防止 float 元素环绕(改为显示滚动条)

c++ - 如何在 VS2012 中将类添加到 openframeworks 项目

c++ - 将 C++ 项目升级到 VS2010,现在出现 AccessViolationException

r - 无法在函数内对 ggplot 使用分面

r - 根据 R 数据框中的名称对列进行平均

c++ - 关于sstream,使用变量作为数组大小和计算溢出