ОШИБКА: AddressSanitizer не удалось выделить - PullRequest
0 голосов
/ 21 сентября 2018

Я написал программу для исследовательского расчета, и эта программа после долгого времени зависала в определенном месте.К сожалению, программа слишком велика, чтобы из нее создать 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 системного менеджера за минуту до сбоя.

Теперь мой вопрос состоит в том, как заставить программу обнаруживать такие ситуации и создавать правильное сообщение об ошибке в таких случаях.

...