如何确定.exe程序的堆栈大小限制?

5

我似乎发现我的程序(使用mingw的g++建立)由于栈内存不足而崩溃。我使用编译选项-Wl,--stack,64000000来增加堆叠限制,但问题仍然存在。我想知道是否有一种实用程序或方法来检查我的.exe程序当前的堆叠限制,以便我可以验证限制是否确实更改为该值。


你目前尝试了什么?必须有一种方法来检查PE可执行文件(我不熟悉Windows环境)。对于ELF,适当的工具是readelfnmobjdump等(请参见https://dev59.com/nI_ea4cB1Zd3GeqPJAyT)。此外,请注意,您可能会遇到其他堆栈限制约束,因为它不是可执行文件的属性,而是环境(操作系统、shell等)的属性。在使用`bash`的Unix系统上,可以调用`ulimit -s`来获取当前堆栈大小限制。最后,您是否使用GNU链接器? - Vladislav Ivanishin
1个回答

7
从这个答案中,要检查堆栈大小,您需要安装Visual Studio并使用Visual Studio工具dumpbin。通常有一个脚本可以运行,以带有所有Visual Studio工具路径的命令提示符窗口,这是vcvarsall.bat或“x64 Native Tools Command Prompt for VS 2019”(或类似的)从开始菜单中选择。

运行

dumpbin /headers executable.exe

这将返回一长串输出。在该输出中,寻找 OPTIONAL HEADER VALUES 部分,并找到其中的 size of stack reserve。默认的堆栈大小被写成 100000(十六进制),即1兆字节。

您可以使用 Visual Studio 提供的 editbin 来更改可执行文件的堆栈大小:

editbin /stack:N executable.exe

此处的N是堆栈大小以字节为单位计算的数值。


2
100000字节是十六进制中的数字,相当于1Mb。 - Spock77
1
@Spock77 你是对的,我已经编辑了答案。 - S R Maiti
2
dumpbin 输出的是十六进制的堆栈大小,而 editbin 则以十进制形式接受堆栈大小。 - Roland Pihlakas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接