Avatar billede nomak Nybegynder
02. februar 2006 - 20:27 Der er 10 kommentarer og
1 løsning

Segmentation fault. core dumped ved mysql udtræk.

MYSQL_ROW urow;
urow = fetch_sql(sql_cmd);

dette virker første gang, men anden gang funktionen bliver kaldt, crasher programmet.

Jeg er lidt lost, hvad kan jeg gøre?

gdb fortæller:

(gdb) where
#0  0x0804bc4e in simple_command ()
#1  0x0804db8a in mysql_real_query ()
#2  0x0804d9bf in mysql_send_query ()
#3  0x0804ae2f in fetch_sql (
    buffer=0x8898000 "SELECT userPass, userId FROM lamusers WHERE userNick='test'") at lamserv.c:617
#4  0x0804a559 in login (nick=0x88890e0 "Zhooter", pass=0x8889100 "test", fd=6)
    at lamserv.c:472
#5  0x0804b1ac in handleMsg (fd=6, nbytes=4) at lamserv.c:670
#6  0x0804b7c0 in main () at lamserv.c:1019
Avatar billede arne_v Ekspert
02. februar 2006 - 21:43 #1
svært at sige uden at se noget mere kode ...
Avatar billede nomak Nybegynder
06. februar 2006 - 22:41 #2
//Logs a user in
int login(char *nick, char *pass, int fd)
{
    MYSQL_ROW urow;
    MYSQL_ROW srow;
    MYSQL_ROW prow;

    char *output;

    char *sql_cmd;

    sql_cmd = (char *) malloc(5000);
    output = (char *) malloc(5000);
   
    sprintf(sql_cmd, "SELECT userPass, userId FROM lamusers WHERE userNick='%s'", nick);

    urow = fetch_sql(sql_cmd); //Det er her den fejler efter anden bruger kalder login funktionen.

    if( urow )
    {
        if( strcmp(urow[0], pass) == 0 )
        {
            time_t login_time = time(NULL);
            strcpy(user[fd].login_nick, nick);
            strcpy(user[fd].nick, nick);
            user[fd].fd = fd;
            user[fd].user_id = atoi(urow[1]);
            user[fd].mode = 1;
            user[fd].logintime = login_time;

            sprintf(sql_cmd, "SELECT ikon, commands, fontColor, fontFace, seeColors, awayMsg, isHidden FROM lamchatsettings WHERE userId='%d'", user[fd].user_id);

            srow = fetch_sql(sql_cmd);
   
            strcpy(user[fd].ikon, srow[0]);
            strcpy(user[fd].flags, srow[1]);
            strcpy(user[fd].fontColor, srow[2]);
            strcpy(user[fd].fontFace, srow[3]);
            user[fd].seeColors = atoi(srow[4]);
            strcpy(user[fd].awaymsg, srow[5]);
            user[fd].hidden = atoi(srow[6]);

            sprintf(sql_cmd, "SELECT inRoom FROM lamchatsessions WHERE userId='%d'", user[fd].user_id);

            prow = fetch_sql(sql_cmd);
           
            user[fd].room_id = atoi(prow[0]);

            sprintf(sql_cmd, "UPDATE lamchatsessions SET cid='%d' where userId='%d'", user[fd].fd, user[fd].user_id);
            do_sql(sql_cmd);

            sendToOne("#SVRR\r\n", fd);

            remove_user(user[fd].user_id, fd);
            initNum();

            sendWelcomeMsg(fd);

            sprintf(output, "#TOPI %s\r\n", room[user[fd].room_id].topic);
            sendToOne(output, fd);
           
            sprintf(output, "#ROOM %s\r\n", room[user[fd].room_id].roomname);
            sendToOne(output, fd);

            sprintf(output, "Du chatter nu i <b>%s</b> (%i/%i)", room[user[fd].room_id].roomname, room[user[fd].room_id].numusers, room[user[fd].room_id].maxusers);

            write_private_system(output, fd);

            if ( user[fd].hidden == 0 )
            {
                sprintf(output, "<b>%s</b> loggede ind kl. %s", user[fd].nick, time_make(1));
                write_system(output, user[fd].room_id);
            }
       
        }

        else
        {
            sendToOne("#ERRO Forkert Kodeord!\r\n", fd);
        }
    }

    else
    {
        sendToOne("#ERRO Forkert NickName!\r\n", fd);
    }
   
   
    free(output);
    free(sql_cmd);
}
Avatar billede arne_v Ekspert
06. februar 2006 - 23:22 #3
hvad goer fetch_sql ?
Avatar billede nomak Nybegynder
06. februar 2006 - 23:27 #4
//Fetches a mysql-row
MYSQL_ROW fetch_sql(char buffer[300])
{
    MYSQL_RES *result;
    MYSQL_ROW row;

    int num_fields;

    mysql_query(mysql_handle, buffer);

    if(mysql_error(mysql_handle)[0] != '\0') {
        printf("%s\n", mysql_error(mysql_handle));
    }

    result = mysql_store_result(mysql_handle);
    num_fields = mysql_num_fields(result);

    row = mysql_fetch_row(result);

    return row;
}
Avatar billede arne_v Ekspert
06. februar 2006 - 23:39 #5
hvor kalder du  mysql_free_result ?
Avatar billede nomak Nybegynder
06. februar 2006 - 23:52 #6
det gør jeg vist slet ikke?
Avatar billede nomak Nybegynder
06. februar 2006 - 23:57 #7
//Fetches a mysql-row
MYSQL_ROW fetch_sql(char buffer[300])
{
    MYSQL_RES *result;
    MYSQL_ROW row;

    int num_fields;

    mysql_query(mysql_handle, buffer);

    if(mysql_error(mysql_handle)[0] != '\0') {
        printf("%s\n", mysql_error(mysql_handle));
    }

    result = mysql_store_result(mysql_handle);
    num_fields = mysql_num_fields(result);

    row = mysql_fetch_row(result);

    mysql_free_result(result);

    return row;
}

har prøvet dette uden held
Avatar billede arne_v Ekspert
07. februar 2006 - 00:32 #8
jeg tror at den er gal fordi du antager at teksterne er nul termineret og ikke
bruger laengderne
Avatar billede arne_v Ekspert
07. februar 2006 - 00:37 #9
int *l = (int *)mysql_fetch_lengths(result);

saa vil l[0] indeholde laengden af row[0]
Avatar billede nomak Nybegynder
07. februar 2006 - 00:56 #10
hvor skulle jeg så sætte det ind?
Avatar billede nomak Nybegynder
07. februar 2006 - 17:13 #11
Jeg fandt ud af at fejlen faktisk lå i en anden funktion. noget med forkert filtype programmet loader. Jeg har løst problemet :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester