Fehler im Public (Run time error 8?)

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Abend.
    Kaum ist der erste Fehler beseitigt, kommt auch schon der nächste & letzte Fehler, bei dem ich leider auch so gut wie keine Ahnung habe, woran es liegt.


    In manchen Fällen, wenn ich den Server neustarte, kommen eine Reihe an Fehlermeldungen in der Server Konsole (MySQL-Debug):

    Code
    [20:25:00] [debug] Run time error 8: "Heap underflow"
    [20:25:00] [debug]  Heap pointer (HEA) is 0x5569B0, heap bottom (HLW) is 0x819A0C
    [20:25:00] [debug] AMX backtrace:
    [20:25:00] [debug] #0 00000008 in public RefuelCheck () from script.amx


    Die obere Meldung wird ununterbrochen geprintet, bis der Server gestoppt wird. Sobald das kommt, kann man auch keine Befehle mehr schreiben. Der Server ist quasi tot, läuft aber noch. ^^
    Da aber selbst Google kaum Ergebnisse zu dem Run time error 8 ausspuckt, wollte ich euch mal fragen, ob ihr eine Lösung hättet, wo der Fehler liegen könnte.


    Der Public unten bewirkt lediglich, dass er überprüft, wie viel Treibstoff das Fahrzeug bereits getankt hat und das entsprechend bei dem Geschäft dieser Treibstoff abgerechnet wird.
    Was vermutlich der Fehler sein könnte, wäre meiner Theorie nach, dass es an der Foreach Include liegen könnte. Oder an der Abfrage, ob der Spieler online ist. Sicher bin ich mir da allerdings nicht. :hm:

    Der Public

    //OnGameModeInit
    SetTimer("RefuelCheck", 500, true);

    Der Public
    //Unten im Script
    forward RefuelCheck();
    public RefuelCheck()
    {
    static
    string[128];

    Der Public
    foreach (new i : Player)
    {
    if (!PlayerData[i][pLogged] || PlayerData[i][pRefill] == INVALID_VEHICLE_ID)
    continue;

    Der Public
    if (PlayerData[i][pRefill] != INVALID_VEHICLE_ID && PlayerData[i][pGasPump] != -1)
    {
    PlayerData[i][pRefillPrice]++;

    Der Public
    CoreVehicles[PlayerData[i][pRefill]][vehFuel] ++;
    PumpData[PlayerData[i][pGasPump]][pumpFuel] --;

    Der Public
    if (PumpData[PlayerData[i][pGasPump]][pumpExists])
    {
    format(string, sizeof(string), "Zapfsäule (%d)\n{FFFFFF}Inhalt: %d Liter", PlayerData[i][pGasPump], PumpData[PlayerData[i][pGasPump]][pumpFuel]);
    UpdateDynamic3DTextLabelText(PumpData[PlayerData[i][pGasPump]][pumpText3D], COLOR_DARKBLUE, string);
    }
    if (CoreVehicles[PlayerData[i][pRefill]][vehFuel] >= 100 || GetEngineStatus(PlayerData[i][pRefill]) || !PumpData[PlayerData[i][pGasPump]][pumpExists] || PumpData[PlayerData[i][pGasPump]][pumpFuel] < 0)
    {
    CoreVehicles[PlayerData[i][pRefill]][vehFuel] = 100;

    Der Public
    GiveMoney(i, -PlayerData[i][pRefillPrice]);
    SendServerMessage(i, "Du hast dein Fahrzeug für $%d betankt.", PlayerData[i][pRefillPrice]);

    Der Public
    if (PumpData[PlayerData[i][pGasPump]][pumpExists])
    {
    if (PumpData[PlayerData[i][pGasPump]][pumpFuel] < 0)
    PumpData[PlayerData[i][pGasPump]][pumpFuel] = 0;

    Der Public
    BusinessData[PlayerData[i][pGasStation]][bizVault] += PlayerData[i][pRefillPrice];
    Business_Save(PlayerData[i][pGasStation]);

    Der Public
    Pump_Save(PlayerData[i][pGasPump]);
    }
    StopRefilling(i);
    }
    }
    }
    return 1;
    }


    Ich habe lediglich ein einziges Thema auf dem englischen SAMP-Forum entdeckt, wo jemand so ziemlich den gleichen Fehler gehabt hat.
    Einige Beiträge darunter meinten, dass man das MySQL-Plugin updaten sollte von R7 auf R8. So hatte es bei denen jedenfalls geholfen.
    Bei mir war es allerdings ergebnislos und die Fehler kommen weiterhin. :S

    Einmal editiert, zuletzt von RayJohnson ()

    • Offizieller Beitrag

    Y_Less aus dem englischen SA-MP Forum hat zu dem Fehler "Heap underflow" folgende Aussage getroffen:


    Zitat

    This means that the compiler has detected that you are using more stack/heap space than is available. A lot of important information is stored on the stack, such as who called the current function, so PAWN knows where to return to. If you use too much memory, because of the way information is allocated, you can overwrite the stack information, returning to a random point in code and almost certainly crashing. At the very least you will get corrupted data where it's been overwritten by other data. When people get this message the standard advice is to use "#pragma dynamic", which is a workaround, not a fix - I find it very odd that something the size of YSI can not generate this error but people's tiny scripts can, don't you? (Quelle: http://forum.sa-mp.com/showpost.php?p=1613876&postcount=2)

    Demzufolge könnte ein #pragma dynamic am Anfang des Gamemodes einen Workaround schaffen, aber das Problem nicht lösen


    „Nicht das, was du nicht weißt, bringt dich in Schwierigkeiten, sondern dass, was du sicher zu wissen glaubst, obwohl es gar nicht wahr ist.“
    Mark Twain

    ---
    ICH BIN NUR HIER UM LEUTE ANZUSCHREIEN

  • Heißt also, wenn ich es richtig verstanden haben sollte, dass ich an dem Knotenpunkt zu viele Daten verarbeiten lasse?
    Pragma hab ich bereits angewendet, oberhalb im Script, weiß aber nicht, ob ich es noch erhöhen sollte.



    #pragma dynamic 100000

  • Beim Compilen kamen die ganze Zeit über keine Meldungen, wie es bei dem Thema der Fall war, das du oben als Quelle angegeben hattest.
    Es taucht lediglich hin und wieder in der Server Konsole auf, wenn ich den Server mal (Neu)starte. Allerdings nur ab und zu. :S
    Das eine mal trat der Fehler auch auf, als ich ein Befehl eingegeben hatte. Das wollte ich allerdings gleich nochmal näher herausfinden, ob es ein bestimmter Befehl war.


    //e: seegras: Könnten auch die Function not registered was damit Zutun haben? Sind mir eben gerade erst aufgefallen.
    Auch wenn die auftauchen, läuft der Server einwandfrei. ?(


  • Das könnte auf jeden Fall eine gute Erklärung für den Fehler sein. Aktualisiere deine Plugins, sodass diese Meldungen nicht mehr kommen, die weißen dich nämlich darauf hin, dass du eine falsche Version (bzw gar keine) des Plugins verwendest.


    Bei dir sind das sscanf, mysql und so wie es scheint das Whirlpool Plugin. Diese Meldungen müssen weg sein, da diese Funktionen im Code stehen, aber nicht ausgeführt werden können, da sie in keinem deiner geladenen Plugins sind.

  • Jeffry: Das Komische ist aber, dass ich eigentlich alle richtigen Plugins / Includes (alle Kompatiblen) habe.
    Selbst beim Umstieg von R7 auf R8 (MySQL) hat nichts gebracht, obwohl die dort aufgelisteten Funktionen eigentlich in der Include dabei sein sollten.


    //e: Sollte ich jetzt alle MySQL & sscanf Plugins durchgehen, bis diese Meldungen dort nicht mehr angezeigt werden oder weiß hier zufällig wer, wie oder welche genaue Version ich in diesem Falle benötige? :hm:

    Einmal editiert, zuletzt von RayJohnson ()

  • Mit der neusten (R39-2) tauchen folgende Fehler auf:

    Spoiler anzeigen

    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(1992) : error 017: undefined symbol "mysql_affected_rows"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(2012) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(13436) : error 017: undefined symbol "mysql_affected_rows"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(13471) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(13995) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14002) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14009) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14016) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14024) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14031) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14204) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14214) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14226) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14238) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14250) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14264) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14273) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14285) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14297) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14309) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14321) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14335) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14347) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14359) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14368) : error 017: undefined symbol "mysql_insert_id"
    D:\So Zeugs\SAMP-0.3z\gamemodes\script.pwn(14377) : error 017: undefined symbol "mysql_insert_id"

    Spoiler anzeigen
    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase

    Spoiler anzeigen
    26 Errors.


    mysql_ping hab ich eben - nach dem Updaten - durch mysql_errno ersetzt.
    Wie man die andern beiden, also mysql_insert_id & mysql_affected_rows ersetzen könnte, weiß ich allerdings nicht.


    //e: Hab eben die alternativen in der R39-2 Version gefunden. Einmal cache_insert_id & cache_affected_rows.
    Nun hab ich alle Zeilen an die R39-2 Version angepasst, allerdings kommt nun wieder folgendes im Server-Log vor wie zuvor auch:

    Einmal editiert, zuletzt von RayJohnson ()