如何知道.exe程序的堆栈大小限制?

Posted

技术标签:

【中文标题】如何知道.exe程序的堆栈大小限制?【英文标题】:How to know the stack size limit of .exe program? 【发布时间】:2019-09-17 23:15:24 【问题描述】:

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

【问题讨论】:

到目前为止您尝试过什么?必须有一种方法可以检查 PE 可执行文件(我不熟悉 Windows 环境)。对于 ELF,合适的工具是 readelfnmobjdump 等(参见 ***.com/questions/32542041/…)。另外,请注意,您可能会遇到其他一些堆栈限制约束,因为它不是可执行文件的属性,而是环境(OS、shell 等)的属性。在使用bash 的unix 系统上,可以调用ulimit -s 来获取当前堆栈大小限制。最后,您使用的是 GNU 链接器吗? 【参考方案1】:

从这个answer,检查堆栈大小,您需要安装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 兆字节。

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

editbin /stack:N executable.exe

这里 N 是堆栈大小的字节数。

【讨论】:

以上是关于如何知道.exe程序的堆栈大小限制?的主要内容,如果未能解决你的问题,请参考以下文章

如何限制我的exe只能安装在特定的计算机上?

应用程序执行期间跟踪堆栈大小

如何压缩1MB以下的独立exe项目?

如何限制管道(windows)的缓冲区大小?

Pyinstaller编译为exe

在 python 脚本中设置堆栈大小