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

如何在Python中更改子进程的堆栈大小,python,visual-studio,msbuild,cmake,stack,Python,Visual Studio,Msbuild,Cmake,Stack,这是我几天前刚开始导致StackOverflow异常的有点复杂的设置: 在我基于windows的持续集成平台上,我得到了一份Jenkins的工作,该工作启动了一个Python脚本。 此Python脚本运行cmake命令、msbuild调用,然后执行新编译的基于gtest的测试框架。 msbuild生成dll和gtest可执行文件。然后,可执行文件本身加载dll以对其进行测试 几天前,我对dll的源代码做了一些更改,这些更改改变了我的一些结构的内存占用(基本上只是数组长度)。这是纯C代码。现在,一

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

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

几天前,我对dll的源代码做了一些更改,这些更改改变了我的一些结构的内存占用(基本上只是数组长度)。这是纯C代码。现在,一些测试退出时出现堆栈溢出异常

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

除此之外,没有递归或任何奇思妙想会成为合法的麻烦来源。大块数据总是通过引用(指针)传递

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

所以,尽管你们可能会因为这个杀了米尔,但我猜在运行Jenkins作业时,我真的没有足够的堆栈内存。 所以我想知道,到底是哪一步定义了DLL代码可用的堆栈内存量。这明显低于我在本地机器上VisualStudio中的默认10MB

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

中的LoadLibrary()宏纯粹是出于运气,我发现尽管相同的CMakeLists.txt用于创建项目(本地和Jenkins上),但从它们生成的结果项目却不同

我的本地项目(以及为查找错误而在服务器上手动创建的GUI VisualStudio解决方案)保留了10MB的堆栈,而基于python的对CMake的调用只使用了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\"")
很抱歉打扰您:) 我很高兴结束了

# 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\"")