Server crasht auf VPS

  • Server crasht auf VPS

    Hey Teeworlds Friends Community,
    aus Langeweile und Lust, habe ich mir eine Teeworlds Mod erstellt. Diese läuft unter meinem Windows PC auch problemlos stundenlang.
    Also habe ich das ganze auf meinem Linux VPS compiled (auch ohne Probleme).
    Server mit "screen" gestartet und zunächst lief das ganze auch. Sobald aber 2 Spieler gejoined sind stürzt das ganze meist ab.
    Jedoch nicht immer, manchmal können auch 3 Spieler eine Weile aktiv spielen, aber irgendwann stürzt es immer ab.
    Über Nacht, wo keiner drauf war, lief es problemlos für 10 Stunden.

    Infos zum VPS:
    - Linux Debian
    - 2 Cores (sind jeweils ungefähr immer zu 10 % ausgelastet)
    - RAM 6GB (meist so um die 300 MB genutzt)
    - 80Gbit/s Anbidung

    Danke für jede Hilfe/ Antwort U+2764
  • Windows ist nun mal nicht Linux! U+1F60A


    apt-get install gdb

    cd /root/teeworlds
    /root/bam/bam -c all
    /root/bam/bam server_debug

    screen -mS "PROZESSNAME" gdb /root/teeworlds/teeworlds_srv_d
    use shortcut Ctrl+a and then d
    re attach with screen -x PROZESSNAME
    write "run"
    use shortcut Ctrl+a and then d

    if you see the serv is down
    program received signal SIGSEGV, Segmentation fault.
    <adress> in function()
    in gdb
    backtrace
    you will see all call trace
    you will also see the code line
    where it crashed
    and if there are variables
    you can
    print var



  • Ich will echt nicht nerven, aber habe folgenden error bekommen:
    Program received signal SIGSEGV, Segmentation fault.
    0x00000000004351a8 in CCharacter::GetPlayer (this=0x0)
    at src/game/server/entities/character.h:67
    67 class CPlayer *GetPlayer() { return m_pPlayer; }

    Also habe ich backtrace benutzt und somit rausgefunden, dass diese Zeile grade die Funktion GetPlayer aufgerufen hat:

    pHit->TakeDamage(vec2(0.f, 0.f), (3 + GameServer()->GetPlayerChar(m_Owner)->GetPlayer()->m_AccData.m_Damage) * GameServer()->GetPlayerChar(m_Owner)->GetPlayer()->m_WarMachine, m_Owner, WEAPON_RIFLE);


    Finde das sehr komisch, weil der Laser die ganze Zeit problemlos funktioniert...
  • befrog57 schrieb:

    pHit->TakeDamage(vec2(0.f, 0.f), (3 + GameServer()->GetPlayerChar(m_Owner)->GetPlayer()->m_AccData.m_Damage) * GameServer()->GetPlayerChar(m_Owner)->GetPlayer()->m_WarMachine, m_Owner, WEAPON_RIFLE);
    Also wenn du sagst, dass es immer der gleiche Fehler sei überprüf doch mal ob das Ergebnis von GameServer()->GetPlayerChar(m_Owner) auch tatsächlich existiert bzw. nicht null ist.

    Der Aufruf über mehrere Pointer ist halt ein wenig unsicher, weil du dir eigentlich nicht immer 100% sicher sein kannst, dass auch alle existieren.

    Probier das mal aus und melde dich nochmal. :)
  • Hey Tim,
    danke für die Antwort.
    Also ich hätte lieber die ganze Funktion posten sollen. Es ist die ganz normale HitCharacter Funktion aus laser.cpp nur mit modifiziertem "TakeDamage".

    bool CLaser::HitCharacter(vec2 From, vec2 To)
    {
    vec2 At;
    CCharacter *pOwnerChar = GameServer()->GetPlayerChar(m_Owner);
    CCharacter *pHit = GameServer()->m_World.IntersectCharacter(m_Pos, To, 0.f, At, pOwnerChar);
    if(!pHit)
    return false;


    m_From = From;
    m_Pos = At;
    m_Energy = -1;
    pHit->TakeDamage(vec2(0.f, 0.f), (3 + GameServer()->GetPlayerChar(m_Owner)->GetPlayer()->m_AccData.m_Damage) * GameServer()->GetPlayerChar(m_Owner)->GetPlayer()->m_WarMachine, m_Owner, WEAPON_RIFLE);
    return true;
    }

    Trotzdem überprüfen ob GameServer()->GetPlayerChar(m_Owner) existiert ? Aber müsste der dann nicht immer exisitieren ? :S