Здравствуйте, гость ( Вход | Регистрация )
|
|
| ||||||||
![]() ![]() |
|
Отправлено: 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
Прикрепленные файлы
-------------------- don't think twice, it's all right
|
|
|
|
|
Отправлено: 20.11.2008, 22:04
|
|
|
Activist ![]() ![]() ![]() Группа: Участник Сообщений: 184 Регистрация: 09.11.2004 Пользователь №: 4766 |
Скорее всего память портится.
Я скомпилял g++ 3.4.2 под виндой. Скомпилялось. Но падает в более-менее рандомных местах. До указанного места просто не доходит. |
|
|
|
|
Отправлено: 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.
|
|
|
|
|
Отправлено: 21.11.2008, 18:50
|
|
|
Veteran ![]() ![]() ![]() ![]() ![]() Группа: Опытный Сообщений: 2620 Регистрация: 05.02.2003 Из: Терешковой street Пользователь №: 280 |
уффф... разобрался наконец то.
На самом деле вся проблема была не совсем в коде, а в отладчике gdb, который ведет себя совершенно "рандомно" при попытки трассировки исключений. Точнее конечно проблема была в коде, но совсем в другом месте. Так что лишний раз подтвердилось, что gdb - suxx. Upd. моя радость была преждевременной - все равно баг остался..... -------------------- don't think twice, it's all right
|
|
|
|
|
Отправлено: 21.11.2008, 20:20
|
|
|
Activist ![]() ![]() ![]() Группа: Участник Сообщений: 184 Регистрация: 09.11.2004 Пользователь №: 4766 |
gdb отвратительно ведёт себя в подавляющем большинстве случаев.
к сожалению. у меня как-то для просмотра корок было 3 версии gdb. и обычно только одна из 3-х показывала корку нормально. Обычно, таки да, подобные проблемы проще найти автоматическими тулзами |
|
|
|
|
Отправлено: 21.11.2008, 23:19
|
|
|
Experienced ![]() ![]() ![]() ![]() Группа: Опытный Сообщений: 989 Регистрация: 07.08.2005 Пользователь №: 12607 |
Надо таки понимать что оно может а что нет. Вот скажем какой дебаггер что-то может при порушенном стеке?
|
|
|
|
|
Отправлено: 22.11.2008, 10:50
|
|
|
Activist ![]() ![]() ![]() Группа: Участник Сообщений: 184 Регистрация: 09.11.2004 Пользователь №: 4766 |
Не-не-не. Порушенный стэк - это святое
gdb очень часто тупо нормальную корку по сиг сегву, с нормальной дебаг инфой показать не может. а другая версия может... а уж когда глубоко начинаешь копать, дык упасть для gdb - это дело чести |
|
|
|
![]() ![]() |
|
Текстовая версия |