PDA

View Full Version : Crash zone.exe when clicking doors in HS and VP


bodi
10-13-2011, 12:49 PM
As soon as anyone on the server with any client zones into howling stones and clicks on a door, it crashes the zone server and I have to restart the server. HALP! I have closed howling stones and VP until we get it fixed

lerxst2112
10-13-2011, 03:31 PM
Look in the zone logs to see if you can find any errors. You can also run the zone in the debugger to find out exactly where it is crashing.

lockjaws
03-01-2012, 10:52 AM
Bodi Did you manage to find out what was causing this issue? As i'm having the same exact issue.

lockjaws
03-01-2012, 01:43 PM
Having gone through this wonderful post

http://www.eqemulator.org/forums/showthread.php?t=34359&highlight=debug
I was able to create a call stack from the zone debugging.

This was in Charasis (howlingstones) when clicking on the west top platform door.
Any help with this is Greatly Appreciated, Thanks.

> Zone.exe!EntityList::GetEntityCorpse(unsigned short id=553) Line 886 + 0x14 bytes C++
Zone.exe!EntityList::GetID(unsigned short get_id=553) Line 973 + 0xf bytes C++
Zone.exe!EntityList::GetFreeID() Line 1166 + 0xd bytes C++
Zone.exe!EntityList::AddCorpse(Corpse * corpse=0x0d7d1260, unsigned int in_id=4294967295) Line 591 + 0x8 bytes C++
Zone.exe!ZoneDatabase::LoadPlayerCorpse(unsigned int player_corpse_id=3516) Line 1743 C++
Zone.exe!ZoneDatabase::GetPlayerCorpseItemAt(unsig ned int corpse_id=3516, unsigned short slotid=16) Line 1618 + 0xc bytes C++
Zone.exe!XS_Client_GetCorpseItemAt(interpreter * my_perl=0x02a71024, cv * cv=0x0b9284c4) Line 5113 + 0x13 bytes C++
perl510.dll!28047f15()
[Frames below may be incorrect and/or missing, no symbols loaded for perl510.dll]
perl510.dll!2806ef18()
perl510.dll!2802a27f()
perl510.dll!28029f9b()
Zone.exe!Embperl::dosub(const char * subname=0x0c542a08, const std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > * args=[...](), int mode=6) Line 346 + 0x13 bytes C++
Zone.exe!PerlXSParser::SendCommands(const char * pkgprefix=0x0018f0d4, const char * event=0x008db610, unsigned int npcid=0, Mob * other=0x0c503fa0, Mob * mob=0x0c503fa0, ItemInst * iteminst=0x00000000) Line 159 + 0xe3 bytes C++
Zone.exe!PerlembParser::EventCommon(QuestEventID event=EVENT_CLICKDOOR, unsigned int objid=0, const char * data=0x0018f164, NPC * npcmob=0x00000000, ItemInst * iteminst=0x00000000, Mob * mob=0x0c503fa0, unsigned int extradata=0) Line 775 + 0x2c bytes C++
Zone.exe!PerlembParser::EventPlayer(QuestEventID evt=EVENT_CLICKDOOR, Client * client=0x0c503fa0, std::basic_string<char,std::char_traits<char>,std::allocator<char> > data="11 0", unsigned int extra_data=0) Line 802 C++
Zone.exe!QuestParserCollection::EventPlayer(QuestE ventID evt=EVENT_CLICKDOOR, Client * client=0x0c503fa0, std::basic_string<char,std::char_traits<char>,std::allocator<char> > data="11 0", unsigned int extra_data=0) Line 161 C++
Zone.exe!Client::Handle_OP_ClickDoor(const EQApplicationPacket * app=0x0c5429d0) Line 5959 C++
Zone.exe!Client::HandlePacket(const EQApplicationPacket * app=0x0c5429d0) Line 456 C++
Zone.exe!Client::Process() Line 740 + 0xf bytes C++
Zone.exe!EntityList::MobProcess() Line 488 + 0x1a bytes C++
Zone.exe!main(int argc=3, char * * argv=0x02c31a80) Line 480 C++
Zone.exe!__tmainCRTStartup() Line 266 + 0x12 bytes C
kernel32.dll!75873677()
ntdll.dll!77b39f02()
ntdll.dll!77b39ed5()
Zone.exe!Parser::LoadScript(int npcid=-1961784568, const char * zone=0x8b500842, Mob * activater=0xe851d84d) Line 1071 + 0x27 bytes C++
4d8b0000()


where the > is it points to this


> if (iterator.GetData()->GetID() == id)
{
return iterator.GetData();
}
iterator.Advance();
}
return 0;

lockjaws
03-02-2012, 12:09 AM
Fixed the issue after looking at the last entry in the call stack debugger log


Zone.exe!EntityList::GetEntityCorpse(unsigned short id=553) Line 886 + 0x14 bytes C++



I emptied the player corpses table, logged back into the test server and hey presto it's no longer crashing and giving the correct blue text

This is Locked!

Tabasco
09-15-2012, 07:11 PM
I'm getting this in various places. It can happen with doors or hailing certain NPC's and the debugging results all point to that GetEntityCorpse prototype.

Has anyone else dealt with this? I've cleared my player corpses table and it's good for a while but it crops back up.

Uleat
09-23-2012, 12:26 AM
[bump] Before I started in on the inverted doors fix some time ago, I actually used to play...

I think I remember having this issue as well way back in April, but it seemed to go away when I started using perl 5.12 and made sure my plugins were up to date.

I haven't been charasis or veeshan's lately, so I'm not sure if that was an absolute fix or not. When I get my setup going 100% going again, I'll see if I can
get perl to act up there for me.

Dunge0nMastr
10-08-2012, 01:57 PM
After having an issue related to this i found that the problem was in the
check_hasitem.pl plugin.

basically the reason clearing corpse table was causing it to work was because of these lines in that plugin:


#Check corpses
if ($body_count > 0) {
for ($i=1; $i<=$body_count; $i++) {
$body_id = $client->GetCorpseID($i);
for ($slot1=0; $slot1<=30; $slot1++) {
$itemid1 = $client->GetCorpseItemAt($body_id, $slot1);
if ($itemid1 == $itmchk) {
return 1;
}
}
for ($slot1=251; $slot1<=340; $slot1++) {
$itemid1 = $client->GetCorpseItemAt($body_id, $slot1);
if ($itemid1 == $itmchk) {
return 1;
}
}
}
}


removing this seemed to solve the issue - i noticed it when i realized that the crashes were only occuring in zones where player.pl governed the locking/unlocking of doors, it also solved a crash within my scripts for checking if players had completed their 1.0s before moving on to a new quest
(using quest::check_hasitem($client, $item_id); )

seems to have fixed it all up removing that block from the plugin. Hope this helps others experiencing it :P

Tabasco
10-12-2012, 08:21 AM
I ended up disabling shadowrest and reducing corpse times as a band-aid until I could dig into it further.
This was very helpful, thanks.

trevius
10-12-2012, 08:44 AM
Maybe a sanity check is needed for "while(1)" ?

int16 EntityList::GetFreeID()
{
if(last_insert_id > 1500)
last_insert_id = 0;
int16 getid=last_insert_id;
while(1)
{
getid++;
if (GetID(getid) == 0)
{
last_insert_id = getid;
return getid;
}
}
}

Seems like that could easily cause an infinite loop if last_insert_id is really high to begin with. Either way, it seems like a bad idea to use "while(1)" to me.

Here is EntityList::GetID() for reference:

Entity* EntityList::GetID(int16 get_id)
{
Entity* ent=0;
if((ent=entity_list.GetEntityMob(get_id))!=0)
return ent;
else if((ent=entity_list.GetEntityDoor(get_id))!=0)
return ent;
else if((ent=entity_list.GetEntityCorpse(get_id))!=0)
return ent;
// else if((ent=entity_list.GetEntityGroup(get_id))!=0)
// return ent;
else if((ent=entity_list.GetEntityObject(get_id))!=0)
return ent;
else if((ent=entity_list.GetEntityTrap(get_id))!=0)
return ent;
else if((ent=entity_list.GetEntityBeacon(get_id))!=0)
return ent;
else
return 0;
}