IPB
 

Здравствуйте, гость ( Вход | Регистрация )

 
 
 
 
 
Ответить в данную темуНачать новую тему
> проблема с исключением, с++, менеджер памяти, исключение в аллокаторе
concolor
Отправлено: 20.11.2008, 19:54
+Цитировать сообщение


Veteran
*****

Группа: Опытный
Сообщений: 2620
Регистрация: 05.02.2003
Из: Терешковой street
Пользователь №: 280



уважаемые товарищи программеры!
помогите разобраться с дурацкой проблемой.

Ситуация. При выполнении фрагмента кода:
CODE

template<class T>
const Interval<T>
Fixed :: allocateSwap (const Size_t bytes, const allocator :: Method method)
{
if (!swap_.isActive()) {
throw exception :: SwapViolation ();
}
if (swap_.getFreeVolume () < bytes) {
throw exception :: OutOfMemory ();
return Interval<T>();
}
return swap_.template allocate<T> (bytes, method);
}

условие swap_.getFreeVolume () < bytes выполняется и по идее должно вызваться исключение throw exception :: OutOfMemory (); , однако почему то этого не происходит, и программа переходит на return swap_.template allocate<T> (bytes, method); , причем портится переменная swap_ (меняется атрибут swap_.free_) и в результате некорректно выделяет память, впоследствии программа падает с segfault'ом. Я в качестве теста вставил сразу после исключения return Interval<T>(); - но безуспешно, потом все равно выполняется return swap_.template allocate<T> (bytes, method);.

Отсюда вопрос: почему не бросается исключение ?

Пояснение: класс Fixed - это менеджер памяти фиксированного размера, swap_ - это особый класс памяти, помимо стека и кучи (не надо путать со свопом на диске), устроенный наподобии песочных часов. Память в swap_ разделена на два куска: основной (больший) и резервный (меньший). Когда переполняется основной, часть данных (важная, существенная, лучшая, etc.) копируются в резервный, после чего резервный увеличивается до размера основного и они меняются ролями (идиома "песочных часов"). Ясно, что функция allocateSwap вызывается в перегруженом операторе new при создании объектов в классе памяти Swap

Приложены исходники. Для того, чтобы увидеть ошибку нужно распаковать архив и сделать там ./configure; make check. Я использую gcc версии 4.3.2. Тест менеджера памяти, который не проходит, расположен в /src/nstl/testing
Прикрепленные файлы
Прикрепленный файл  mdl_0.7.7.tar.gz ( 3,25 мегабайт ) Кол-во скачиваний: 16
 


--------------------
don't think twice, it's all right
 
Перейти в начало страницы
Xecutor
Отправлено: 20.11.2008, 22:04
+Цитировать сообщение


Activist
***

Группа: Участник
Сообщений: 184
Регистрация: 09.11.2004
Пользователь №: 4766



Скорее всего память портится.
Я скомпилял g++ 3.4.2 под виндой. Скомпилялось.
Но падает в более-менее рандомных местах.
До указанного места просто не доходит.
 
Перейти в начало страницы
busa
Отправлено: 21.11.2008, 16:25
+Цитировать сообщение


Veteran
*****

Группа: Ведущий
Сообщений: 2734
Регистрация: 12.11.2002
Пользователь №: 74



попробуйте valgrind


--------------------
It's very hard to explain why you're mad, even if you're not mad.
 
Перейти в начало страницы
concolor
Отправлено: 21.11.2008, 18:50
+Цитировать сообщение


Veteran
*****

Группа: Опытный
Сообщений: 2620
Регистрация: 05.02.2003
Из: Терешковой street
Пользователь №: 280



уффф... разобрался наконец то.
На самом деле вся проблема была не совсем в коде, а в отладчике gdb, который ведет себя совершенно "рандомно" при попытки трассировки исключений. Точнее конечно проблема была в коде, но совсем в другом месте. Так что лишний раз подтвердилось, что gdb - suxx.

Upd. моя радость была преждевременной - все равно баг остался.....


--------------------
don't think twice, it's all right
 
Перейти в начало страницы
Xecutor
Отправлено: 21.11.2008, 20:20
+Цитировать сообщение


Activist
***

Группа: Участник
Сообщений: 184
Регистрация: 09.11.2004
Пользователь №: 4766



gdb отвратительно ведёт себя в подавляющем большинстве случаев.
к сожалению.
у меня как-то для просмотра корок было 3 версии gdb.
и обычно только одна из 3-х показывала корку нормально.

Обычно, таки да, подобные проблемы проще найти автоматическими тулзами smile.gif
 
Перейти в начало страницы
Basilevs
Отправлено: 21.11.2008, 23:19
+Цитировать сообщение


Experienced
****

Группа: Опытный
Сообщений: 989
Регистрация: 07.08.2005
Пользователь №: 12607



Надо таки понимать что оно может а что нет. Вот скажем какой дебаггер что-то может при порушенном стеке?
 
Перейти в начало страницы
Xecutor
Отправлено: 22.11.2008, 10:50
+Цитировать сообщение


Activist
***

Группа: Участник
Сообщений: 184
Регистрация: 09.11.2004
Пользователь №: 4766



Не-не-не. Порушенный стэк - это святое smile.gif
gdb очень часто тупо нормальную корку по сиг сегву, с нормальной дебаг инфой показать не может.
а другая версия может...
а уж когда глубоко начинаешь копать, дык упасть для gdb - это дело чести smile.gif
 
Перейти в начало страницы

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Удалить установленные форумом cookies · Отметить все сообщения прочитанными
RSS Текстовая версия