Я написал программу для исследовательского расчета, и эта программа после долгого времени зависала в определенном месте.К сожалению, программа слишком велика, чтобы из нее создать 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
есть какая-либо ошибка.
Проблема перестает работать, если я очищаю адрес или нет.
Есть ли какой-нибудь другой ключ, чтобы найти корень ошибки?
Обновление
Я наконец нашел проблему.16 ГБ ОЗУ сделало меня высокомерным.Система выходит из ОЗУ.Вот Sceenshot системного менеджера за минуту до сбоя.
Теперь мой вопрос состоит в том, как заставить программу обнаруживать такие ситуации и создавать правильное сообщение об ошибке в таких случаях.