Краш на SaveToDB()
Ревизия: 10105
Ядро: MaNGOS + insider42 + SD2 ACE: enable-builtin-ace CONF: CFLAGS="-O1 -march=core2 -g -mssse3 -mfpmath=sse" CXXFLAGS="-O1 -march=core2 -g -mssse3 -mfpmath=sse" OS: 2.6.34-gentoo-r1 Падает в функции Player::_SaveQuestStatus, в строке: Код:
for( QuestStatusMap::iterator i = mQuestStatus.begin( ); i != mQuestStatus.end( ); ++i ) Код:
#0 0x00007f11a9005276 in std::_Rb_tree_increment(std::_Rb_tree_node_base*) () from /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/libstdc++.so.6 Пробовал: 1) Удалил mtmaps полностью 2) Обновил ядро операционной системы, gcc до вресии 4.4.4 3) Обновил glibc и весь софт Краш происходит достаточно часто с попеременным успехом, может происходить не только на стадии сохранения квестов, но и на стадии сохранения ачивментов |
{<No data fields>}, <No data fields>},
пустые данные в базу пытается лить? |
Нет, краш происходит в Rb_tree_increment, предположительно в ++itr, поэтому и спрашиваю, как же так? :(
Бред бредом :-\ |
а сделай
# gcc -v # /lib/libc.so.6 интересно, какие версии |
пути стека неисповедимы, краш может показать где угодно. смотри по коду рядом. возможно и правда в базу не вливается. возможно таблица сломалась, возможно синтаксическая ошибка, возможно запись не нулл поля с пустым значеним, и т.д. и т.п.
|
Да не, ошибку в SQL он в логе покажет.
|
только если побитые данные в памяти вроде такое возможно...
|
Просто такое не у него одного. У меня тоже такое было, и не раз. Я бы сказал - постоянно.
Память живая 100% |
|
VladimirMangos прочитай пожалуйста.
Цитата:
Я тоже ловлю краши, правда в других местах. И никак не могу отловить. Но пытаюсь =) В дебаге на локале всё замечательно, на лайв серве время от времени происходят :sorry: Но, ноги от туда-же растут. Ситуация такая - в одном месте выделили память, занесли туда значения, затем по ненадобности освободили её (иначе была бы утечка, чего не происходит), но в другом месте обращение идёт именно туда. Там уже естественно не то что ожидалось. Вот и ловим краш. Эхх. Криво у нас всё. Шаг влево, шаг вправо - расстрел. На Delphi есть замечательная функция, которая отладку на несколько порядков упрощает (я Delphi програмер лет 15 =) ): procedure FreeAndNil(var Obj); var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; если подобную функцию использовать в движке для очистки, то сразу будет видно, где и что. И ещё одно - почему не используется SEH? Переносимо на все платформы: try { Я ща чёго-то натворю =) } catch { ShowMessage("Ой, сломалося, предположение такое-то"); } Сразу будет видно, где и что. Такое впечатление, что наши топовые разработчики отстали на лет 10. Извиняюсь если резко, но это так. P.S. Чтобы не быть голословным, выложу наколенный вариант утильки на Delphi, которую писАл, когда github глючил, для скачивания сорцов Карателя по HTTP. Заметьте, что даже для такой фигни (грубо говоря) в коде везде используется try - finally. Привычка целостности. Вообще можно любое оттуда скачать (c гитхаба), только адрес указать нужный. Может кому-то пригодится: http://slil.ru/29416531 P.P.S. Вот чесслово есть желание переписать всё ядро на Delphi. Таких проблем там в принципе быть не может. И ASM код лучше и быстрее. И все указатели защищены. И баги ловятся с полпинка. Но это утопия к сожалению =( ... |
Ловлю частые краши на выгрузке мобов/петов/игроков :(
Вот один из них: Код:
#0 0x00007f2c5dd22165 in raise () from /lib/libc.so.6 |
GriffonHeart
Изменил в Конфиге у себя. Краши пропали. До правки серв падал каждые полчаса-час. Код:
CharLogFile = "" Поставил данный фикс: Код:
------------------------------- src/game/Map.cpp ------------------------------- |
Цитата:
|
Цитата:
|
Кстати... Я правильно понимаю, что ни на чистом ядре, ни на венде, подобного не наблюдается? То есть это всплывает лишь под *никс, или же на ядре insider42?
|
Не знаю. Но я уже в панике, мне юзеры мозг съели.
Наверно придётся пределать сервер под "чистый" мангос и проверить, будет ли падать :-\ О результатах конечно сообщу... PS: Даже с отключенным CharLogFile падает |
Конечно может еще что-то с gcc оптимизацией кода.
Цитата:
1. Те кто комментируют assert-ы и предлагают разный перехваты exceptions должны понимать что иногда лучше упасть серверу чем получить геморой со некоторой вероятность нарушенных данных в базе для играков. 2. Где вы приведенному куске кода увидели освобождение памяти и не обнуленные указатели. Там _статическая_ на момент началей куска кода структура в которое (a) итератор не может нигде стаить инвалидным в процессе ее выполгнения (b) изменяется тоько одно поле _не_указатель_ в структуре. Т.е. или проблема с генерированным кодом самим компилятором, или структура на вызов куска кода уже нарушена по содержанию (как я предположил ранее), или какой-то из вызываемого кода пишет куда попало и разрушает структуру в процессе - учитывае код - это работа с запросами к базе - но если бы там были такие проблемы - мы бы заметили бы это горазда чаще. 3) как вам обнуление указателся поможет решить проблему с другим указателем в совершенно другом месте на тот-же удаленный объект. Обычно проблемы не с не-обнуленным указателем при удалении, а с альтернативным указателем на удаленный объекта. Так что иногда лучше читать чем писать... передовой вы наш... |
запустите с valgrind
сразу увидите все места где память corrupted |
Текущее время: 06:42. Часовой пояс GMT +3. |
ru-mangos.ru - Русское сообщество MaNGOS