首页 > 解决方案 > “无法打开 cygwin.S”以某个变量值显示

问题描述

我的程序在 2D 网格上运行有限元方法。该代码适用于小于 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++g++cygwinmingw

解决方案


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

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

关于“cygwin.S”“缺失”的另一件事是调试器试图找到出现问题的源代码文件。但是我们使用的编译器不是来自源代码,而是其他人预先构建的库/可执行文件(我不确定我是否使用了正确的术语),所以 .S 源代码文件从一开始就不存在.

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


推荐阅读