Блуждающий std::bad_alloc
От: Dez  
Дата: 15.06.11 14:31
Оценка:
Всем привет.
Возникла такая проблема.
Есть приложение которое открывает файлы, процессит их, и закрывает.
Так вот в ходе процессинга переодически возникает исключение bad_alloc
которое местами можно перехватить а местами (внутри библиотеки QT) неззя.
Исключение рандомное — на рандомных файлах бывает редко но бывает.
В том числе происходит при попытке создать обыкновенный класс без внутренних наворотов.

Собственно вопрос — что может быть причиной того что валидные операторы new вызывают std::bad_alloc ?

Дополнительная информация:
1) в приложении используются сторонние библиотеки которые не исключено могут портить память
но вот я не очень пойму что такого должно быть испорчено в памяти чтобы апликуха вылетала с невозможностью выделить память.
2) библиотека которая может портить память использует CRT 5-й версии (линукс) а сама апликуха 6-ю
3) если скипать эти бедаллоки — то все работает нормально
4) аппликуха отжирает всего 200 метров памяти из 3х гигабайт
5) иногда так же само падает QT — но тут уже не перехватишь исключение.
Re: Блуждающий std::bad_alloc
От: nen777w  
Дата: 15.06.11 14:37
Оценка:
ИМХО тут дебагером только смотреть надо.
Может быть всё угодно от фрагментации памяти, неправильного размера выделяемой памяти (например переполнение где то или что то такое), до кривого самопального алокатора (если такой используется).
Re[2]: Блуждающий std::bad_alloc
От: Dez  
Дата: 15.06.11 14:41
Оценка:
Здравствуйте, nen777w, Вы писали:

N>ИМХО тут дебагером только смотреть надо.

N>Может быть всё угодно от фрагментации памяти, неправильного размера выделяемой памяти (например переполнение где то или что то такое), до кривого самопального алокатора (если такой используется).

вот дебагером то не посмотришь.
так как эксепшин после 15-ти минут работы в среднем
и когда он отлавливается — то встек то уже раскручен.
ставить бряку на все экспешины бесполезно так как используется модель возврата ошибки по экспешину а не по коду возврата.

кастомные мемори аллокаторы не юзаются.
Re: Блуждающий std::bad_alloc
От: nen777w  
Дата: 15.06.11 14:43
Оценка:
кстати вот вариант когда кучу смешали с г-ном
2) библиотека которая может портить память использует CRT 5-й версии (линукс) а сама апликуха 6-ю
недавно боролся с подобным. только там рушилось сразу (под дебагом конечно это было видно). Выделяли память в одной CRT а освобождали в другой.
Re[3]: Блуждающий std::bad_alloc
От: nen777w  
Дата: 15.06.11 14:48
Оценка:
Dez>ставить бряку на все экспешины бесполезно так как используется модель возврата ошибки по экспешину а не по коду возврата.

А зачем на все эксепшены. Если в студии работаете то в Debug->Exceptions... C++Exceptions->std::exception
Или ваши исключение тоже от std::exception унаследованы?
Re[4]: Блуждающий std::bad_alloc
От: Dez  
Дата: 15.06.11 14:51
Оценка:
Здравствуйте, nen777w, Вы писали:

Dez>>ставить бряку на все экспешины бесполезно так как используется модель возврата ошибки по экспешину а не по коду возврата.


N>А зачем на все эксепшены. Если в студии работаете то в Debug->Exceptions... C++Exceptions->std::exception

N>Или ваши исключение тоже от std::exception унаследованы?

бага повторяется только под линуксом
а там только бряка на все эксепшины — или я не прав ?
Re: Блуждающий std::bad_alloc
От: uzhas Ниоткуда  
Дата: 15.06.11 16:36
Оценка: 1 (1)
Здравствуйте, Dez, Вы писали:

Dez>Собственно вопрос — что может быть причиной того что валидные операторы new вызывают std::bad_alloc ?

например, выделение слишком больших кусков памяти (>4 гигабайта). бывает при использовании неинициализированных переменных
рекомендации:
1) проверить crash dump
2) использовать valgrind
3) проверить (r)limits
Re[2]: Блуждающий std::bad_alloc
От: rm822 Россия  
Дата: 15.06.11 18:06
Оценка:
Типичный баг, по крайней мере под виндой
чтобы вылетел бэдаллок не нужно портить память, или отжирать ее. Вполне достаточно в 2ГБ адресное пространство загрузить 50 дллек, которые порубят его на непрерывные куски по 40мб +-
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Блуждающий std::bad_alloc
От: chemey  
Дата: 17.06.11 10:55
Оценка:
Здравствуйте, Dez, Вы писали:

Dez>вот дебагером то не посмотришь.

Dez>так как эксепшин после 15-ти минут работы в среднем
Dez>и когда он отлавливается — то встек то уже раскручен.

Дык не перехватывай его вообще нигде.
В результате твое приложение завершится аварийно, при этом стек раскручен не будет.
Можно будет посмотреть бэктрейс.
Бзззззззжжжжж
Re[3]: Блуждающий std::bad_alloc
От: Dez  
Дата: 17.06.11 19:46
Оценка:
Здравствуйте, rm822, Вы писали:

R>Типичный баг, по крайней мере под виндой

R>чтобы вылетел бэдаллок не нужно портить память, или отжирать ее. Вполне достаточно в 2ГБ адресное пространство загрузить 50 дллек, которые порубят его на непрерывные куски по 40мб +-

Ваш ответ подтолкнул к поиску ошибки.
Оказалось что в программе есть утечки памяти (около 100-200 МБ) в принципе не критичных, но их много и судя по всему они сильно фрагментировали память что собственно иногда не позволяло выделить цельный блок нужного размера.
Полечив утечки вылечились и креши.

Занимательная бага.
Re[5]: Блуждающий std::bad_alloc
От: Peregrin  
Дата: 18.06.11 13:42
Оценка:
Здравствуйте, Dez, Вы писали:

Dez>бага повторяется только под линуксом

Dez>а там только бряка на все эксепшины — или я не прав ?

В GDB help catch throw <exceptname>
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.