我编写了一个用于研究计算的程序,该程序在某个位置附近的长时间放置后崩溃了。不幸的是,该程序太大,无法从中创建MWE。但是,我意识到当崩溃时,没有创建core
文件,也没有消息显示。另外,当我创建了一些std::cout
命令来显示消息时(我在Linux上没有调试器),然后我发现了崩溃的位置。当我创建更多屏幕输出日志时,崩溃更改的位置虽然它们仅影响屏幕而不影响变量。对我来说,这是堆栈损坏的指标。
我进行了搜索,发现了这些添加到gcc
编译器中的选项
-fsanitize=address -fno-omit-frame-pointer
这是输出结果的结尾:
==2603==ERROR: AddressSanitizer failed to allocate 0x10000 (65536) bytes of memory at address 0x62e60b3f0 (error code: 12)
ERROR: Failed to mmap
它发生在
之前my_vector2.push_back(my_vector1[i]);
要检测是否是由于my_vector1
和my_vector2
造成的,我已将代码破坏为
auto AAA=my_vector1[i];
cout<<"AAA"<<endl;
my_vector2.push_back(AAA);
cout<<"BBB"<<endl; /* does not reach here */
然后,我再次对其进行了检查:
AAA
==2603==ERROR: AddressSanitizer failed to allocate 0x10000 (65536) bytes of memory at address 0x62e60b3f0 (error code: 12)
ERROR: Failed to mmap
这意味着BBB
的输出未达到。
尽管在互联网上有一些有关此错误的结果,但使我的情况与众不同的是
1-根据错误消息,为我分配的长度为65536
。这个数字是2^16
,我确信这不是偶然的,它具有一定的意义。
2- push_back
函数会发生这种情况。我怀疑STL
是否有错误。
无论我是否清理地址,问题都无法解决。
还有其他线索可以找到错误的根源吗?
更新
我终于找到了问题所在。 16GB RAM使我傲慢自大。系统内存不足。这里是 Sceenshot 崩溃发生前一分钟的系统管理员。
现在,我的问题是如何使程序检测到这种情况并在这种情况下创建正确的错误消息。