Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Crash gry przy zapisywaniu logu

Ostatnio zmodyfikowano 2024-04-02 18:11
Autor Wiadomość
dunno
Temat założony przez niniejszego użytkownika
Crash gry przy zapisywaniu logu
» 2024-03-31 18:57:46
Przy zapisywaniu logu występuje crash silnika gry

C/C++
// start info only for me
std::stringstream infogm;
infogm << "[ONLINE ADDBAN] You add ban for player: " << name2 << ", reason: " << Reason << ", " << comment << " hours.";
if( IPban != 0 )
   
 infogm << " Also he get IP Ban for one day.";

if( player )
   
 player->sendTextMessage( MSG_BLUE_TEXT, infogm.str().c_str() );
// start info only for me

char buf[ 64 ];
time_t ticks = time( 0 );
strftime( buf, sizeof( buf ), "%Y/%m/%d %H:%M", localtime( & ticks ) );
std::ofstream out( "data/logs/bans.log", std::ios::app );
out << "[" << buf << "] " << player->getName() << " -> " << bannedPlayer->getName() << " was banished because of " << Reason << ".";
if( IPban != 0 )
   
 out << " Also he get IP Ban for one day.";

out << std::endl;
out.close();

Logi gdb: https://pastebin.com/F25Lz89s.

Linia #1  0x566c6d8a in Protocol76::parseGM (this=0xc3064ee0, msg=...) at protocol76.cpp:4461
to: out << "[" << buf << "] " << player->getName() << " -> " << bannedPlayer->getName() << " was banished because of " << Reason << ".";

Czy byłby ktoś w stanie pomóc rozwiązać/nakierować na rozwiązenie problemu w tym zakresie? Raz błąd wywoluje a raz nie. Więc pomyślałem ze to znowu jakiś problem z lockami, ale to raczej nie to, a crash troche z "niczego".
P-180962
DejaVu
» 2024-03-31 20:39:36
Powinieneś najpierw zadbać o to, aby zamknąć wszystkie wątki, a dopiero potem zamknąć plik z logami i wyłączyć grę. Być może zamykasz plik z logami i po jego zamknięciu inny wątek chce dodać wpis do logu.
P-180963
dunno
Temat założony przez niniejszego użytkownika
» 2024-03-31 21:09:22
czyli to moze być również ten problem z "lockami" i powinienem dodać locki w tej funkcji wskazanej przez gdb? czy źle rozumiem?
C/C++
void Protocol76::parseGM( NetworkMessage & msg )
{
   
OTSYS_THREAD_LOCK_CLASS lockClass( game->gameLock, "Protocol76::parseGM()" );
   

Edit: teraz kolejny błąd z niczego:
Log gdb https://pastebin.com/Ju15Wj45
map.cpp https://pastebin.com/raXAZ4jf

Linia na ktora wskazuje gdb:
#4  0x56669488 in Map::getSpectators (this=0x58fab930, range=..., list=std::vector of length 4, capacity 4 = {...}, onlyPlayers=false, checkDuplicate=96) at map.cpp:463


to
spectatorCache[ centerPos ].reset( new SpectatorVec( list ) );


te bledy sa ze soba powiazane? co moze byc przyczyna tym razem?
P-180964
DejaVu
» 2024-04-01 19:25:28
Lock nie rozwiąże Ci problemów przy zamykaniu aplikacji. Musisz zadbać o to, aby najpierw zwinąć wszystkie wątki zanim zaczniesz zwijać wątek główny aplikacji.
P-180965
pekfos
» 2024-04-02 18:11:21
A czemu w ogóle mówimy o zamykaniu aplikacji? Nie jest to w czasie normalnej pracy?

czyli to moze być również ten problem z "lockami" i powinienem dodać locki w tej funkcji wskazanej przez gdb? czy źle rozumiem?
Może. Przydałoby się zobaczyć co robią inne wątki. Niesynchronizowany dostęp do kontenera może wywołać crash i bywa że inny wątek będzie też zatrzymany na gorącym uczynku. Następnym razem przed wyjściem z gdb zrób set pagination off i thread apply all bt by wypisać backtrace ze wszystkich wątków, albo zrób zrzut do pliku do dalszej interaktywnej analizy. https://sourceware.org/gdb/current/onlinedocs/gdb.html/Core-File-Generation.html

out << "[" << buf << "] " << player->getName() << " -> " << bannedPlayer->getName() << " was banished because of " << Reason << ".";
#0  0xf7c97563 in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /lib/i386-linux-gnu/libstdc++.so.6
Wywaliło się konkretnie na wypisywaniu jakiegoś std::string, więc albo nazwa gracza player albo bannedPlayer. Z interaktywnym dostępem można by zrobić więcej, np obejrzeć sobie te obiekty.
P-180966
« 1 »
  Strona 1 z 1