gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:16:20 26 4
gpt4 key购买 nike

我用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com