Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очень длинный switch блок 
:(
    Опции темы
Master01
Дата 26.4.2013, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2



Доброго дня

Может кто-нибудь, сталкивался с чем-то подобным или есть какие-нибудь идеи.
Ситуация следующая - есть функция , в которой находится очень большой switch-case блок, около 50 case блоков,
в строках кода - примерно 2000 строчек, но, наверно, не суть.
В этот switch добавил ещё один case, после чего система стала зависать. pstack показывает что все потоки (их в сиcтеме ~100 ) застряли на 
new или delete (malloc/free), причём в какой момент это происходит не ясно, т.к. система работает минут 30-40 до зависания.

Забавно следующее - перенёс код нового case блока в отдельную функцию и из case её вызывал - всё равно вешалась.
Удалил все изменения в старой функции, весь код положил в новую и стал вызывать её минуя старую функцию со switch блоком - взлетело и работает.

Проверил по спецификации - минимальное число поддерживаемых блоков case в switch - 64 или 256 т.е. у меня точно меньше.
Да и симптомы какие-то непонятные.
Вешалось оно в разным местах, давольно отдалённых от функции, которая изменялась.

Что за затык, кто-нибудь может предположить? Памяти 50% свободно (64 Гб из 128)

Код - c++ core, stl + boost 1.35 и CORBA  (у меня сомнения вменяемости может вызывать только последняя)
Компилится это CC на Solaris 10 . 

Вот кусок дампа из pstack.

-----------------  lwp# 89 / thread# 89  --------------------
 ffffffff7a4d270c lwp_park (0, 0, 0)
 ffffffff7a461c4c free (22f7f4f20, 2270, 18a3d0, ffffffff7a460d08, ffffffff7a5ec000, 2000) + 28
 ffffffff7b50786c void operator delete(void*) (22f7f4f20, 3e80, ffffffff609fb4df, 104274, ffffffff7b60ca60, 0) + 4
 000000010069be88 void std::allocator<double>::deallocate(double*,unsigned long)const (ffffffff609fb830, 22f7f4f20, 7d0, ffffffff609fb56f, ffffffff7261c2
00, 0) + 30
 000000010069bc44 std::_Vector_base<double,std::allocator<double> >::~_Vector_base #Nvariant 1() (ffffffff609fb820, 22f7f8da0, ffffffff609fb808, ffffffff
609fb64f, ffffffff7b60ca60, 12ce61680) + 5c
 000000010069b1b4 std::vector<double>::~vector #Nvariant 1() (ffffffff609fb820, 0, ffffffff609fb808, ffffffff609fb76f, ffffffff7bd15a38, ffffffff7bbab940
) + 2c


Это сообщение отредактировал(а) Master01 - 26.4.2013, 22:38
PM MAIL   Вверх
volatile
Дата 26.4.2013, 23:30 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Master01 @  26.4.2013,  22:34 Найти цитируемый пост)
очень большой switch-case блок, около 50 case блоков

Скорей всего дело не свитче, а в чем-то другом.
Вариантов может множество, например возможно у вас создание объектов в свитче
Код

case 1:
   OBJ obj1;
   // ...
   break;
case 2:
   OBJ obj2;
   // ...
   break;

так делать очень не надо.
Ну в общем много чего может быть...

 smile 
Цитата(Master01 @  26.4.2013,  22:34 Найти цитируемый пост)
Памяти 50% свободно (64 Гб из 128)

у вас 128 Гб оперативы?
PM MAIL   Вверх
Master01
Дата 29.4.2013, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2



Да нет, объекты в case не создаются. Кроме того там весь код обрамлялся  {} . Я правильно понял, что беспокойство вызывало именно области видимости для этих объектов?
Я понимаю, что может быть всё что угодно smile я не понимаю, что может привести к тому, что операционка перестаёт обслуживать malloc/free. При этом оно же не валится а просто весит.
Да, оперативы 128 Гб - это большой Sun-овский бокс. Там ещё 2 4х ядерных спарка по 16 потоков на ядро smile поэтому в системе и 128 потоков.


Это сообщение отредактировал(а) Master01 - 29.4.2013, 09:15
PM MAIL   Вверх
feodorv
Дата 29.4.2013, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



У Вас там точно break'и стоят в нужном месте?
Код

switch( ... )
{
  case _old:
    ...
    break ;
  case _new:
    ...
    break ;
  default:
    ...
}


Это сообщение отредактировал(а) feodorv - 29.4.2013, 10:11


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Silent
Дата 29.4.2013, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: нет
Всего: 9



Может быть оператор switch реализован "по-интересному"?
Попробуйте этот случай условием выкинуть либо за switch, либо в ветку default, и посмотреть результат.
Еще может быть вам покажется полезным ознакомиться с этой статьей, вдруг cc в солярисе реализовывает switch как в JVM'е
PM MAIL   Вверх
xvr
Дата 29.4.2013, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Судя по дампу стека у вас проблемы с памятью. Возможно большая фрагментация и частые заказы/возвращения памяти. У run-time'а в Solaris с этим были большие проблемы  smile 



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.