dar*_*win 5 c++ crash debugging gcc address-sanitizer
我编写了一个用于研究计算的程序,该程序在某个位置附近很长时间后崩溃了。不幸的是,该程序太大而无法从中创建 MWE。但是,我意识到崩溃时,没有core创建文件,也没有显示任何消息。另外,当我创建了一些std::cout显示消息的命令时(我在没有调试器的Linux上),然后我找到了崩溃的位置。当我创建更多数量的屏幕输出日志时,崩溃的位置会发生变化,而它们只会影响屏幕而不是变量。对我来说,这是堆栈损坏的指标。
我搜索并找到了我添加到gcc编译器中的这些选项
-fsanitize=address -fno-omit-frame-pointer
Run Code Online (Sandbox Code Playgroud)
这是输出结果的结尾:
==2603==ERROR: AddressSanitizer failed to allocate 0x10000 (65536) bytes of memory at address 0x62e60b3f0 (error code: 12)
ERROR: Failed to mmap
Run Code Online (Sandbox Code Playgroud)
它发生在之前
my_vector2.push_back(my_vector1[i]);
Run Code Online (Sandbox Code Playgroud)
为了检测这是否是因为my_vector1和my_vector2,我已经破解了代码
auto AAA=my_vector1[i];
cout<<"AAA"<<endl;
my_vector2.push_back(AAA);
cout<<"BBB"<<endl; /* does not reach here */
Run Code Online (Sandbox Code Playgroud)
然后,我又检查了一遍:
AAA
==2603==ERROR: AddressSanitizer failed to allocate 0x10000 (65536) bytes of memory at address 0x62e60b3f0 (error code: 12)
ERROR: Failed to mmap
Run Code Online (Sandbox Code Playgroud)
这意味着BBB输出没有达到。
虽然,互联网上有一些关于这个错误的结果,但让我的情况不同的是
1- 分配给我的长度是65536根据错误信息确定的。这个数字2^16我确信不是偶然的,它有一定的意义。
2- 这发生在push_back功能上。我怀疑STL有任何错误。
无论我是否对地址进行消毒,问题都会停止工作。
有没有其他线索可以找到错误的根源?
更新
我终于找到了问题所在。16GB RAM让我很自大。系统内存不足。这是 系统管理员崩溃前一分钟的 截图。
现在,我的问题是如何让程序检测到这种情况并在这种情况下创建正确的错误消息。
| 归档时间: |
|
| 查看次数: |
6065 次 |
| 最近记录: |