NT Crash Thread
Moderators: Community Managers, Developers
Re: NT Crash Thread
At first, I thought this was me, because I had a debug assertion with the same error code about an iterator outside the range. It was there because I hadn't resized the vector based on the max debuffs and buffs rules. I fixed it locally and the error went away. But I haven't committed that code yet.
My dev time is a bit low right now (I basically have an hour or two tops between 9:30 and 11:30pm) to get some stuff done. I'm trying to get a few things done to support Zippy's charge through the combat system, but I'll try taking a look at the SQL implementation. I know nothing about it though so I'm not sure how much it will help.
My dev time is a bit low right now (I basically have an hour or two tops between 9:30 and 11:30pm) to get some stuff done. I'm trying to get a few things done to support Zippy's charge through the combat system, but I'll try taking a look at the SQL implementation. I know nothing about it though so I'm not sure how much it will help.
Re: NT Crash Thread
Code: Select all
WorldServer.exe!Client::GetAccountID() Line 264 C++
> WorldServer.exe!Net::SendClientChunkInfo(std::shared_ptr<Client> & client, int coord_x, int coord_y) Line 722 C++
WorldServer.exe!CommandProcess::CommandSummon(std::shared_ptr<Client> & client, Separator * sep, unsigned char command_index, bool world_client) Line 1442 C++
WorldServer.exe!CommandProcess::Process(std::shared_ptr<Client> & client, Separator * sep, unsigned char command_index, bool world_client) Line 229 C++
WorldServer.exe!Net::HandleWorldChatPacket(std::shared_ptr<Client> & client, PacketStruct * packet_struct) Line 796 C++
WorldServer.exe!Net::Process() Line 313 C++
WorldServer.exe!main(int argc, char * * argv) Line 240 C++
WorldServer.exe!__tmainCRTStartup() Line 241 C
WorldServer.exe!mainCRTStartup() Line 164 C
kernel32.dll!76d9338a() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]
ntdll.dll!77659f72() Unknown
ntdll.dll!77659f45() Unknown
Re: NT Crash Thread
If this is beneficial at all - someone online told me she was stuck in APW and couldn't move. I .goto'ed to her to check it out, then I got stuck too. I .rift'ed out and was still stuck in the chunk I .rift'ed to. I tried to .summon her and we crashed.
Haiku is easy -
But sometimes it makes no sense.
Refridgerator.
But sometimes it makes no sense.
Refridgerator.
Re: NT Crash Thread
This is why we can't have nice things
Re: NT Crash Thread
This one again.
Looking at this section of code.
shared_ptr<Client> client; is showing empty
Code: Select all
> WorldServer.exe!Mutex::ReadLock() Line 99 C++
WorldServer.exe!UDPServer::GetClient(unsigned int account_id) Line 196 C++
WorldServer.exe!ChunkServer::GetClient(unsigned int account_id) Line 188 C++
WorldServer.exe!UDPServer::KickDupeClients(unsigned int account_id, unsigned int connection_id) Line 270 C++
WorldServer.exe!Net::HandleCharacterSelected(std::shared_ptr<Client> & client, PacketStruct * packet_struct) Line 588 C++
WorldServer.exe!Net::Process() Line 195 C++
WorldServer.exe!main(int argc, char * * argv) Line 249 C++
WorldServer.exe!__tmainCRTStartup() Line 241 C
WorldServer.exe!mainCRTStartup() Line 164 C
kernel32.dll!7716337a() Unknown
ntdll.dll!77c492e2() Unknown
ntdll.dll!77c492b5() Unknown
Code: Select all
shared_ptr<Client> UDPServer::GetClient(uint32_t account_id) {
shared_ptr<Client> client;
m_clients.ReadLock();
for (auto& itr : clients) {
if (itr.second->GetAccountID() == account_id && itr.second->IsConnected()) {
client = itr.second;
break;
}
}
m_clients.ReadUnlock();
return client;
}
Re: NT Crash Thread
Is it crashing within that code or when it returns a null client? Whatever is calling it needs to be prepared for that possibility. Most all crashes I see programming-wise are by assuming a pointer has a real object to point to and not checking first before accessing member functions and variables.
Re: NT Crash Thread
[quote="zippyzee"]Is it crashing within that code or when it returns a null client? Whatever is calling it needs to be prepared for that possibility. Most all crashes I see programming-wise are by assuming a pointer has a real object to point to and not checking first before accessing member functions and variables.[/quote]
I'm mostly just looking at EQ2 emu's code right now but took a peek at this since I've seen it posted a few times. It's probably this line here (UDPServer.cpp line 270)
The pointer to the chunk (assuming that's a zone server) is likely invalid.
I'm mostly just looking at EQ2 emu's code right now but took a peek at this since I've seen it posted a few times. It's probably this line here (UDPServer.cpp line 270)
Code: Select all
auto character = world_client->GetCharacter();
if (character) {
auto chunk_client = character->GetCurrentChunk()->GetClient(world_client->GetAccountID()); <---
if (chunk_client) {
auto chunk = character->GetCurrentChunk();
if (chunk) {
chunk->DisconnectChunkClient(chunk_client,CLIENT_DISCONNECT_NEW_CONNECTION_ATTEMPT);
}
}
}
- John Adams
- Retired
- Posts: 4581
- Joined: Wed Aug 28, 2013 9:40 am
- Location: Phoenix, AZ.
- Contact:
Re: NT Crash Thread
This one went away for some time. Please check the last few commits for anything touching disconnect. I think Black tried to fix the Unreal channel warning, not sure if it's near this code.
Re: NT Crash Thread
[quote="smash"][quote="zippyzee"]Is it crashing within that code or when it returns a null client? Whatever is calling it needs to be prepared for that possibility. Most all crashes I see programming-wise are by assuming a pointer has a real object to point to and not checking first before accessing member functions and variables.[/quote]
I'm mostly just looking at EQ2 emu's code right now but took a peek at this since I've seen it posted a few times. It's probably this line here (UDPServer.cpp line 270)
The pointer to the chunk (assuming that's a zone server) is likely invalid.[/quote]
The chunk needs to be accessed first and checked for validity, just like character and the client. Combining both in the auto chunk_client = ... line is a potential hazard. This code is even more odd because in order to have a chunk_client, you have to have a chunk. The code gets the chunk_client by getting the chunk for the character in that line, and then if it gets the chunk_client, goes back to get the chunk again, and tests to see if it is there only at that point (which it had to be to have gotten the chunk_client to begin with, and if it wasn't there then the previous line would have crashed the server). So it really doesn't make much sense logically.
I'm mostly just looking at EQ2 emu's code right now but took a peek at this since I've seen it posted a few times. It's probably this line here (UDPServer.cpp line 270)
Code: Select all
auto character = world_client->GetCharacter();
if (character) {
auto chunk_client = character->GetCurrentChunk()->GetClient(world_client->GetAccountID()); <---
if (chunk_client) {
auto chunk = character->GetCurrentChunk();
if (chunk) {
chunk->DisconnectChunkClient(chunk_client,CLIENT_DISCONNECT_NEW_CONNECTION_ATTEMPT);
}
}
}
The chunk needs to be accessed first and checked for validity, just like character and the client. Combining both in the auto chunk_client = ... line is a potential hazard. This code is even more odd because in order to have a chunk_client, you have to have a chunk. The code gets the chunk_client by getting the chunk for the character in that line, and then if it gets the chunk_client, goes back to get the chunk again, and tests to see if it is there only at that point (which it had to be to have gotten the chunk_client to begin with, and if it wasn't there then the previous line would have crashed the server). So it really doesn't make much sense logically.
- Blackstorm
- Retired
- Posts: 354
- Joined: Thu Sep 04, 2014 11:11 am
- Location: Paris, FRANCE
- Contact:
Re: NT Crash Thread
Maybe if we add a check :
Code: Select all
shared_ptr<Client> UDPServer::GetClient(uint32_t account_id) {
shared_ptr<Client> client;
m_clients.ReadLock();
for (auto& itr : clients) {
auto client_check = nullptr;
client_check = itr.second;
if(client_check == nullptr)
continue;
if (client_check->GetAccountID() == account_id && client_check->IsConnected()) {
client = client_check;
break;
}
}
m_clients.ReadUnlock();
return client;
}