[MySQL] Segmentation fault bei mysql_fetch_field

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
  • Hallo,


    ich habe seit ein paar Stunden folgendes Problem:
    Beim starten des Server über Putty kommt ein Segmentation fault.


    Den Fehler konnte ich auf folgende Funktion eingrenzen:



    Function()
    {
    new result[100];
    for(new h=0; h<sizeof Array; h++)
    {
    format(mysql_string, sizeof mysql_string, "SELECT * FROM table WHERE id LIKE '%d'", h+1);
    mysql_fix_query(mysql_string, sql);
    mysql_store_result(sql);
    if(mysql_num_rows(sql) == 1)
    {
    mysql_fetch_field_row(result,"owner", sql);
    format(Array[h][hoOwner], MAX_PLAYER_NAME, "%s", result);
    mysql_fetch_field_row(result,"name", sql);
    format(Array[h][hoName], 52, "%s", result);
    mysql_fetch_field_row(result,"hx", sql); Array[h][hoX] = floatstr( result );
    mysql_fetch_field_row(result,"hy", sql); Array[h][hoY] = floatstr( result );
    mysql_fetch_field_row(result,"hz", sql); Array[h][hoZ] = floatstr( result );
    mysql_fetch_field_row(result,"owned", sql); Array[h][hoOwned] = strval( result );
    }
    return 1;
    }



    Die Zeile mysql_fetch_field_row(result,"owner", sql); verursacht meiner Meinung nach den Error.
    Es laufen die Plugins mysql.so (Von Strickenkid), sscanf2.so, streamer.so (Von Inkognito) und whirpool.so


    Das Serverlog ist ohne Auffälligkeiten.


    Das komische:
    Wenn ich den Server mit dem Plugin crashdetect.so startet, dann startet der Server. Ohne startet er garnicht.
    Das ist aber erst, seit ich obrige Function eingebaut habe.


    Ich hab aus lauter Verzweiflung den ganzen Server mit strace überprüft.
    Die ausgabe hab ich mal angehängt, aber ich finde dabei keinen schwerwiegenden Fehler, der auf einen Segmentation fault hinweist.


    Als Server läuft Debian Squeeze 64 Bit mit 32 Bit Libary, MySQL 5.1.66 per ATP installiert.
    Server wird als eigener Benutzer ohne Admin Rechte ausgeführt, was bislang auch ohne Probleme geklappt hat.


    Falls weiter Infos benötigt werden bitte melden.


    MfG
    Wepper


    //Edit
    So, endlich hinbekommen. Der Server startet jetzt überhaupt nicht mehr :cursing: .
    Crashdetect spuckt folgendes aus:


    Die Function, die hier Probleme macht, ist die obrige.


    //Edit 2:
    Wenn ich den Server mit strace starte, stürzt er nicht ab, zumindest ist er jetzt grad 3 mal ohne Probleme hochgefahren.
    Aber dass ist doch nicht die Lösung?!

  • Teste das mal hier
    Function()
    {
    new result[100];
    for(new h=0; h<sizeof Array; h++)
    {
    format(mysql_string, sizeof mysql_string, "SELECT * FROM table WHERE id LIKE '%d'", h+1);
    mysql_fix_query(mysql_string, sql);
    mysql_store_result(sql);
    if(!mysql_num_rows(sql))
    continue;
    if(mysql_retrieve_row(sql))
    {
    mysql_fetch_field_row(result,"owner", sql);
    format(Array[h][hoOwner], MAX_PLAYER_NAME, "%s", result);
    mysql_fetch_field_row(result,"name", sql);
    format(Array[h][hoName], 52, "%s", result);
    mysql_fetch_field_row(result,"hx", sql); Array[h][hoX] = floatstr( result );
    mysql_fetch_field_row(result,"hy", sql); Array[h][hoY] = floatstr( result );
    mysql_fetch_field_row(result,"hz", sql); Array[h][hoZ] = floatstr( result );
    mysql_fetch_field_row(result,"owned", sql); Array[h][hoOwned] = strval( result );
    }
    }
    return mysql_free_result() & 1;
    }
    Sollte eigendlich gehen
    Und wenn du mit MySQL SELECT machst dann nutz auch free result am ende


    //e
    kleinen Fehler behoben

    All in all it's just another brick in the wall

  • Hey
    Danke für deinen Vorschlag.
    Die Function mysql_retrieve_row wird von dem Plugin, welches ich nutze, nicht unterstütz und auf der Plugin Seite im Wiki seh ich keine Alternative Function.


    Wegen dem mysql_free_result: Das hatte ich am ende, hab ich aber beim kopieren vergessen ...


    Und was mich stutzig macht: Wenn der Server startet, wie auch immer, dann lädt er die Daten ja ... .
    Aber halt nur, wenn er startet und nicht wegen dem segemtation fault abbricht.

    Mit freundlichem Gruß
    Weper

  • Ich nutze, wie oben erwähnt, das Plugin von Strickenkid, und da gibts die Funktion leider nicht.


    Sorry mein Fehler :D


    Das sollte aber klappen
    Function()
    {
    new result[100];
    for(new h=0; h<sizeof Array; h++)
    {
    format(mysql_string, sizeof mysql_string, "SELECT * FROM table WHERE id LIKE '%d'", h+1);
    mysql_fix_query(mysql_string, sql);
    mysql_store_result(sql);
    if(!mysql_num_rows(sql))
    continue;
    mysql_fetch_row_data(sql);
    mysql_fetch_field("owner",result,sql);
    format(Array[h][hoOwner], MAX_PLAYER_NAME, "%s", result);
    mysql_fetch_field("name",result,sql);
    format(Array[h][hoName], 52, "%s", result);
    mysql_fetch_field("hx",result,sql);Array[h][hoX] = floatstr( result );
    mysql_fetch_field("hy",result,sql);Array[h][hoY] = floatstr( result );
    mysql_fetch_field("hz",result,sql);Array[h][hoZ] = floatstr( result );
    mysql_fetch_field("owned",result,sql);Array[h][hoOwned] = strval( result );
    }
    return mysql_free_result() & 1;
    }

    All in all it's just another brick in the wall

  • Danke dir.
    Ich hab die Function von dir eingebaut, ein wenig angepasst und die Datei ex­pli­zit im binäry Mode übertragen und siehe da, es gab keinen Fehler mehr.

    Mit freundlichem Gruß
    Weper