如何在Python中更改子进程的堆栈大小

拉瓦

这是几天前刚开始引起StackOverflow异常的我有点复杂的设置:

在基于Windows的持续集成平台上,我得到了一个Jenkins作业,该作业启动了Python脚本。此Python脚本运行cmake命令,msbuild调用,然后执行新编译的基于gtest的测试框架。msbuild生成一个dll和gtest可执行文件。然后可执行文件本身会加载dll以便对其进行测试。

几天前,我在dll的源代码中进行了一些更改,从而更改了某些结构的内存占用量(基本上只是数组长度)。这是纯C代码。现在,某些测试会退出并带有堆栈溢出异常。

我承认我在堆栈上放了一些数据结构,这些数据结构不一定必须存在,但这是隐藏在C中的最好信息(比使用静态全局变量更好)。

if(myCondition)
{
    int hugeBuffer[20000];
    ...
}

除此之外,没有递归或进行任何花哨的事情都可能是麻烦的合法来源。大块数据始终通过引用(指针)传递。

无论如何,除非直接减少链接器设置中的保留堆栈内存,否则在直接从Visual Studio运行gtest可执行文件的本地计算机上不会发生堆栈溢出异常。然后,在调试模式下,我显然遇到了堆栈刚在函数开始时溢出的情况。不幸的是,我找不到任何调试堆栈有多满的方法。在VS中,我只有调用堆栈窗口,该窗口不显示堆栈的当前“填充水平”。

因此,尽管你们可能为此杀死mir,但我猜我在运行Jenkins作业时确实没有足够的堆栈内存。所以我想知道哪个步骤实际上定义了可用于我的DLL代码的堆栈内存量。它显然比本地计算机上VisualStudio中的默认10MB小。

在msbuild步骤中,链接器没有使用STACK参数,因此我猜测exe标头应包含与Visual Studio中相同的值(10MB?)。Python脚本运行一个subprocess.call,它可以忽略链接器设置的值并将其覆盖。我既找不到任何信息,也找不到有关如何更改分配的堆栈内存的信息。我什至不知道它是产生一个线程还是一个进程,这也可能会影响堆栈的大小Windows中的DLL加载机制对我来说也有些神秘,但是我猜该DLL使用的堆栈与使用它的可执行文件相同。我正在使用WinBase.h中的LoadLibrary()宏。

拉瓦

凭运气,我发现,尽管使用相同的CMakeLists.txt来创建项目(在本地和Jenkins上),但从它们生成的结果项目却有所不同。

我的本地项目(以及我在服务器上手动创建的用于查找错误的GUI-VisualStudio解决方案)保留了10MB的堆栈,而对CMake的基于python的调用仅使用默认值1MB,这对于项目来说是不够的。

通过将以下行添加到CMakeLists.txt中,可以弥补Cmake的这种奇怪行为:

# Set linker to use 10MB of stack memory for all gtest executables, the default of 1MB is not enough!
SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} /STACK:\"10000000\"")

抱歉打扰你了:)我很高兴一切都结束了

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章