PDA

Просмотр полной версии : краш с пулами


Insider42
05.05.2010, 14:12
Краш появился примерно после перехода на 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 не предлагать! как минимум должна быть его замена, но никак не удаление.

LordJZ
05.05.2010, 14:31
Подтверждаю, падает часто.

Rage Hunter
05.05.2010, 15:10
Подтверждаю, Очень часто!

GriffonHeart
06.05.2010, 08:50
собственно поэтому пришлось вообще отрубить пулы :(

Insider42
06.05.2010, 11:00
давайте лучше разбираться в том как это работает и из-за чего происходит... вот например переменная 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
09.05.2010, 10:47
Всё таки крашнулось, опять с тем же дампом. Интересно!
Он таки прошёл
ReSpawn1Object(obj);
и крашнулся всё на том же
ASSERT(spawns.IsSpawnedObject<T>(obj->guid));
я недоумении :/
Никто даже представления не имеет в чем может быть проблема?

LordJZ
09.05.2010, 11:10
Я думаю об этом знают только авторы системы, насколько я помню, это Neo2003 и кто-то еще из команды UDB, ну и, конечно, Vladimir.

zergtmn
09.05.2010, 12:12
9134 на этом не падает, ищите причину в последующих коммитах.

Insider42
09.05.2010, 12:23
Этот assert был добавлен в 9260 ревизии http://github.com/mangos/mangos/commit/dd1f50c6994bea2154b29268e31be4787f58a264 , затем было ещё одно изменение http://github.com/mangos/mangos/commit/dc0b7ce8a835d257cf383c72ade7476682879da8

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

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

Insider42
21.06.2010, 12:01
Должно быть исправлено в [10089] (http://github.com/mangos/mangos/commit/0219b08a427de6e405f03fbc19d61c9e93181973)