'Unable to open cygwin.S' 出现在变量的特定值处

'Unable to open cygwin.S' shows up at a certain value for a variable

我的程序运行是二维网格上的有限元法。该代码适用于小于 195x195 的网格,但每当我尝试将其变大时,都会显示以下内容:

Unable to open 'cygwin.S': Unable to read file 'c:\mingw810\src\gcc-8.1.0\libgcc\config\i386\cygwin.S' (Error: Unable to resolve non-existing file 'c:\mingw810\src\gcc-8.1.0\libgcc\config\i386\cygwin.S').

我一开始就尝试下断点来检查问题出在哪里,但是没有用,因为问题出现在断点之前。我想这与编译器和内存有关,因为问题会在特定大小的网格上弹出。 我没有把代码放在这里,因为它太大而且涉及的文件很少,但我创建指针的方式是:

int *pivot_N;

我正在使用:

g++ (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0

我有52个变量,其中16个是指针。问题可能是我的变量太多了吗? 我没有太多经验,但也尝试 运行 在更高 RAM 的计算机上以防万一,但问题仍然存在。

我认为这是一个“堆栈溢出”问题。它与C++中的内存分配有关。对于函数内的变量(例如 main()),它们的大小不能超过“堆栈”大小。 “堆栈”大小可能由编译器或 OS 决定。通常堆栈大小只有 1 MB、2 MB 左右。

我 运行 在 Windows 上的 VScode 中使用 MinGW-w64 的 gdb 进行调试时遇到了同样的问题。 当数组太大时,比如 600,000 个元素,我尝试 运行 exe,但它很快终止。所以我调试了它,它显示“cygwin.S”未找到或类似的东西。 调试器可能在 main() 函数启动之前知道要使用的内存大小。我认为编译器也应该知道这一点,但它还是会生成可执行文件。

关于“cygwin.S”“缺失”的另一件事是调试器试图找到出现问题的源代码文件。但是我们使用的编译器不是来自源代码,而是其他人的 pre-built library/executable(我不确定我是否使用了正确的术语),因此 .S 源代码文件不是从头开始。

我的代码解决方案是改用全局变量,即将数组声明放在 main() 函数之前。但正确的方法可能是“动态内存分配”。那就是在“堆”内存而不是“堆栈”内存上正确分配大内存。如果简单地将大变量放在任何函数之外不符合您的目的,您应该研究一下。