Crash gry przy zapisywaniu logu
Ostatnio zmodyfikowano 2024-04-02 18:11
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 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() ); 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". |
|
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. |
|
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? 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/Ju15Wj45map.cpp https://pastebin.com/raXAZ4jfLinia 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? |
|
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. |
|
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.htmlout << "[" << 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. |
|
« 1 » |