Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Баг-репорты

Важная информация

Баг-репорты Описываем проблемы и ошибки работы ядра

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.05.2010, 14:12   #1
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию краш с пулами

Краш появился примерно после перехода на 3.3.2.
Сейчас стоит ревизия 9835. Присутствует и на чистом мангосе.
База YTDB 543
Код:
#0  0x0061f410 in __kernel_vsyscall ()
No symbol table info available.
#1  0x004d8df0 in raise () from /lib/libc.so.6
No symbol table info available.
#2  0x004da701 in abort () from /lib/libc.so.6
No symbol table info available.
#3  0x004d226b in __assert_fail () from /lib/libc.so.6
No symbol table info available.
#4  0x08390723 in PoolGroup<Creature>::SpawnObject (this=0x988e0e8,
    spawns=@0xd3715a4, limit=1, triggerFrom=119807, instantly=false)
    at ../../../src/game/PoolManager.cpp:279
        obj = (PoolObject *) 0xa50c0b0
        i = 0
        lastDespawned = 0
        count = 1
        __PRETTY_FUNCTION__ = "void PoolGroup<T>::SpawnObject(SpawnedPoolData&, uint32, uint32, bool) [with T = Creature]"
        __FUNCTION__ = "SpawnObject"
#5  0x0838d201 in PoolManager::SpawnPoolGroup<Creature> (this=0xd371528,
    pool_id=5676, db_guid=119807, instantly=false)
    at ../../../src/game/PoolManager.cpp:726
No locals.
#6  0x08390b3c in PoolManager::UpdatePool<Creature> (this=0xd371528,
    pool_id=5676, db_guid_or_pool_id=119807)
    at ../../../src/game/PoolManager.cpp:787
        motherpoolid = <value optimized out>
#7  0x081aff15 in Creature::Update (this=0x273f9bd8, diff=129)
    at ../../../src/game/Creature.cpp:407
        poolid = 5676
#8  0x0829b07a in VisitorHelper<MaNGOS::ObjectUpdater, Creature> (
    v=@0xaa6ee280, c=@0x251c8384) at ../../../src/game/GridNotifiersImpl.h:48
No locals.
#9  0x0829cbd1 in VisitorHelper<MaNGOS::ObjectUpdater, Creature, TypeList<DynamicObject, TypeList<Corpse, TypeNull> > > (v=@0xaa6ee280, c=@0x251c8384)
    at ../../../src/game/../framework/GameSystem/TypeContainerVisitor.h:57
No locals.
#10 0x08296c3d in Map::Update (this=0x14cbb8b8, t_diff=@0xaa6ee2b8)
    at ../../../src/game/../framework/GameSystem/TypeContainerVisitor.h:80
        plr = <value optimized out>
        area = {right_offset = 1, left_offset = 2, upper_offset = 1,
  lower_offset = 2}
        updater = {i_timeDiff = 129}
        __FUNCTION__ = "Update"
        __PRETTY_FUNCTION__ = "virtual void Map::Update(const uint32&)"
#11 0x082a8a35 in MapManager::Update (this=0x130b8140, diff=32)
    at ../../../src/game/MapManager.cpp:262
Падает тут
Код:
            ASSERT(spawns.IsSpawnedObject<T>(obj->guid));
Есть какие-нибудь идеи по поводу исправления? тупо закомментить assert не предлагать! как минимум должна быть его замена, но никак не удаление.
Insider42 вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
LordJZ (05.05.2010)
Старый 05.05.2010, 14:31   #2
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Подтверждаю, падает часто.
LordJZ вне форума   Ответить с цитированием
Старый 05.05.2010, 15:10   #3
Rage Hunter
Гость
 
Сообщений: n/a
По умолчанию

Подтверждаю, Очень часто!
  Ответить с цитированием
Старый 06.05.2010, 08:50   #4
GriffonHeart
Гость
 
Сообщений: n/a
По умолчанию

собственно поэтому пришлось вообще отрубить пулы
  Ответить с цитированием
Старый 06.05.2010, 11:00   #5
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

давайте лучше разбираться в том как это работает и из-за чего происходит... вот например переменная db_guid_or_pool_id - почему такое название? Ведь у нас уже есть pool_id.
Что означает triggerFrom?

Суть самого ассерта
ASSERT(spawns.IsSpawnedObject<T>(obj->guid));
прибивать сервер если не смог заспавнить объект типа <T> (ГО либо кричеры) с текущим гуидом? Тогда должны быть какие-то причины, по которым он не смог этого сделать.

В общем то, что пока разобрал:
Код:
    int count = limit - spawns.GetSpawnedObjects(poolId);
=0, т.к. limit = 1, spawns.GetSpawnedObjects(poolId); = 1. Да да, у нас есть заспавненый объект
Код:
    if (triggerFrom)
        ++count;
Пул затриггерен от объекта с гуидом 119807. Теперь count = 1
Код:
i = 0
первый шаг
Код:
        PoolObject* obj = RollOne(spawns,triggerFrom);
        if (!obj)
            continue;
выбирает один из спавнов в пуле, у нас "по идее" он один с гуидом 119807. То, что прошёл !obj проверку означает что он действительно есть.
Код:
        if (obj->guid == lastDespawned)
            continue;
в принципе бесполезно это проверять на первом шаге, ибо , отпадает...
Код:
        if (obj->guid == triggerFrom)
Это я вообще не понимаю, что есть triggerFrom и его назначение? Ощущение, что это означает главный пул, от которого исходят дочерние.
Код:
            ASSERT(spawns.IsSpawnedObject<T>(obj->guid));
Проверяем есть "заспавнен ли объект?" Вот тут то и непонятка, мы проверяем заспавнен ли он, возвращает false и сервер слетает, т.е. будто моб не заспавнен О_о

Кстати, пока что краши были только с пулами где max_limit=1. Поэтому у меня идея куда-нибудь воткнуть проверку на limit, дабы не проходить это место

Есть ещё идеи? Кто-то хочет поправить мою теорию? Если есть хоть малейшие догадки - пишите. Не давайте мне вести монолог

И ещё, создается впечатление что это попросту напутано и должно быть так
Код:
        if (obj->guid == triggerFrom)
        {
            ReSpawn1Object(obj);
            ASSERT(spawns.IsSpawnedObject<T>(obj->guid));
            ASSERT(spawns.GetSpawnedObjects(poolId) > 0);
            triggerFrom = 0;
            continue;
        }
Если не поняли где это менять, то вот
Код:
diff --git a/src/game/PoolManager.cpp b/src/game/PoolManager.cpp
index d94381d..cef9ab9 100644
--- a/src/game/PoolManager.cpp
+++ b/src/game/PoolManager.cpp
@@ -276,9 +276,9 @@ void PoolGroup<T>::SpawnObject(SpawnedPoolData& spawns, uint32 limit, uint32 tri
 
         if (obj->guid == triggerFrom)
         {
+            ReSpawn1Object(obj);
             ASSERT(spawns.IsSpawnedObject<T>(obj->guid));
             ASSERT(spawns.GetSpawnedObjects(poolId) > 0);
-            ReSpawn1Object(obj);
             triggerFrom = 0;
             continue;
         }

Последний раз редактировалось Insider42; 06.05.2010 в 14:26.
Insider42 вне форума   Ответить с цитированием
4 пользователя(ей) сказали cпасибо:
lina (06.05.2010), PSZ (21.06.2010), Wish (06.05.2010), YuruY (06.05.2010)
Старый 09.05.2010, 10:47   #6
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Всё таки крашнулось, опять с тем же дампом. Интересно!
Он таки прошёл
Код:
            ReSpawn1Object(obj);
и крашнулся всё на том же
Код:
            ASSERT(spawns.IsSpawnedObject<T>(obj->guid));
я недоумении :/
Никто даже представления не имеет в чем может быть проблема?
Insider42 вне форума   Ответить с цитированием
Старый 09.05.2010, 11:10   #7
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Я думаю об этом знают только авторы системы, насколько я помню, это Neo2003 и кто-то еще из команды UDB, ну и, конечно, Vladimir.
LordJZ вне форума   Ответить с цитированием
Старый 09.05.2010, 12:12   #8
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

9134 на этом не падает, ищите причину в последующих коммитах.
zergtmn вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Insider42 (09.05.2010), LordJZ (09.05.2010)
Старый 09.05.2010, 12:23   #9
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Этот assert был добавлен в 9260 ревизии http://github.com/mangos/mangos/comm...1be4787f58a264 , затем было ещё одно изменение http://github.com/mangos/mangos/comm...e7476682879da8

То, что об этом знают только конкретные люди не значит что мы должны "сложа ручки" сидеть и ждать

Возможно от краша поможет частичный откат изменений 9260, а конкретно изменений в этой функции где наш assert.

Последний раз редактировалось Insider42; 09.05.2010 в 12:41.
Insider42 вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Lurker (12.05.2010)
Старый 21.06.2010, 12:01   #10
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Должно быть исправлено в [10089]
Insider42 вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Краш в Map.h PSZ Баг-репорты 2 01.09.2011 12:39
Краш на выгрузке xex Баг-репорты 18 03.05.2011 11:53
Краш в ObjectGridLoader.cpp Most Баг-репорты 0 01.12.2010 17:47
краш lovepsone Баг-репорты 47 09.08.2010 03:25
Краш xmolex Баг-репорты 2 04.05.2010 18:37


Текущее время: 04:42. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot