Avatar billede martinbk Nybegynder
19. maj 2003 - 14:09 Der er 19 kommentarer og
2 løsninger

applikation core dumper vilkårligt

hejsa jeg har rodet lidt med en socket server og har nu også fået den til at kører mit eneste problem er den core dumper vilkårligt, jeg har kørt GDB på min coredump og fået følgende output:
Core was generated by `server'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/lib/libm.so.2...done.
Reading symbols from /usr/lib/libz.so.2...done.
Reading symbols from /usr/lib/libc.so.4...done.
Reading symbols from /usr/libexec/ld-elf.so.1...done.
#0  0x804b097 in auth (fd=5,
    ukey=0xbfbff14c "ce28b563aea092ea3b40dbcbeaf90004") at server.c:583
583            strcpy(nick, srow[2]);
(gdb)

funktionen der åbenbart indeholder fejl ser sådan ud:

int auth(int fd, char ukey[56]) {
if (user[fd].mode == 0) {
    int affe,i;
    char *nick;
    char cmd[1000];
    char loginmsg[1000];
    MYSQL_ROW srow;
    MYSQL_ROW urow;
    char topi[500];
    char usrlst[5000];
    char usrmsg[5000];
    time_t seconds = time(NULL);
    replace(ukey, "\n", "");
    replace(ukey, "\r", "");
    replace(ukey, "\n\r", "");
    replace(ukey, "\n\r", "");
    sprintf(cmd, "SELECT * FROM chat_sessions WHERE user_code='%s'", ukey);

    srow = fetch_sql(cmd);

    strcpy(nick, srow[2]);

    strcpy(user[fd].nick, nick);

    strcpy(user[fd].login_nick, nick);

    i = seconds;

    user[fd].mode = 1;
    user[fd].user_id = atoi(srow[1]);
    user[fd].logintime = i;

    sprintf(cmd, "SELECT * FROM chat_users WHERE nick='%s'", srow[2]);
    urow = fetch_sql(cmd);
    strcpy(user[fd].ikon, urow[4]);
    strcpy(user[fd].flags, urow[6]);

    sprintf(cmd, "UPDATE chat_sessions SET cid='%i', authed='1' WHERE user_code='%s'", fd, ukey);

    affe = do_sql(cmd);

    sprintf(loginmsg, "<b>%s</b> loggede ind kl. %s", nick, time_make(1));
    sprintf(topi, "#TOPI %s\n\r", topic);

    userlist_update(usrlst, fd);

    sprintf(usrmsg, "#USER %s\n\r", usrlst);
    sendtoone("#SVRR\n\r", fd);

    sendtoone(topi, fd);
    sendtoall(usrmsg);
    write_system(loginmsg);

    strcpy(loginmsg, "");
    return 1;
}
}

håber nogen kan fortælle mig hvorfor jeg får denne mystiske fejl. og hvorfor det er vilkårligt hvornår min app dumper med en segmentation fault
Avatar billede chries Nybegynder
19. maj 2003 - 14:26 #1
bug 1.

der er ingen plads allokeret til nick, så den skriver vilkårlige steder i hukommelsen.

strcpy(nick, srow[2]);
Avatar billede martinbk Nybegynder
19. maj 2003 - 14:39 #2
hmm kunne du ikke give mig et eks. på hvordan jeg evt. alokerer sådanne variabler i min hukommelse?. er temmelig newbie til det her C halløj
Avatar billede arne_v Ekspert
19. maj 2003 - 14:46 #3
nick = (char *) malloc(100);

vil sætte plads af til 99 tegn i nick (der skal bruges 1 til nul byten).
Avatar billede martinbk Nybegynder
19. maj 2003 - 14:59 #4
jeg spørger lige igen for at værre sikker, men skulle jeg i så fald sætte den ind før eller efter mit SQL kald ?
Avatar billede arne_v Ekspert
19. maj 2003 - 15:04 #5
Den skal bare sættes ind før du strcpy'er noget ind i nick.
Avatar billede chries Nybegynder
19. maj 2003 - 15:13 #6
hvis du ved nick er under en hvis længde, kunne du også istedet for
char *nick;

kunne du også bare skrive
char nick[512]; // nick max 511 tegn
Avatar billede martinbk Nybegynder
19. maj 2003 - 15:15 #7
er det iorden hvis jeg venner tilbage med et svar om 24 timer, er nød til at stabilitetsteste den. prob er jo den går ned vilkårligt?
Avatar billede chries Nybegynder
19. maj 2003 - 15:39 #8
hvis du bruger malloc metoden, skal du også huske at bruge

free(nick);

når du ikke skal bruge hukommelsen mere. Ellers har du et memory leak og den æder din hukommelse op og crasher :)
Avatar billede martinbk Nybegynder
19. maj 2003 - 17:40 #9
owell i gav begge fyldestgørende svar, smid et svar begge 2, umiddelbart virker det, og hvis ikke vender jeg tilbage
Avatar billede arne_v Ekspert
19. maj 2003 - 18:25 #10
Jeg synes ikke at jeg har bidraget med særligt meget, så jeg synes
at du skal give chries alle pointene.
Avatar billede chries Nybegynder
20. maj 2003 - 16:36 #11
del dem som du synes :)
Avatar billede martinbk Nybegynder
20. maj 2003 - 19:44 #12
hmm det virkede så ikke min applikation laver stadig segmentation fault
#0  0x804b087 in auth (fd=7,
    ukey=0xbfbff14c "8d85e50a491232fb1a08e32d5289b554") at server.c:589
589            strcpy(nick, srow[2]);
Avatar billede chries Nybegynder
21. maj 2003 - 08:05 #13
måske skulle du tjecke at fetch_sql er ok? hvis den returer 0 eller hvad den gør for at sige fetch fejlede?

og bruge malloc med størrelsen af nick.

nick = (char *)malloc(strlen(srow[2)+1);

strcpy(nick, srow[2]);

....

free(nick);
Avatar billede martinbk Nybegynder
21. maj 2003 - 13:03 #14
hmm normalt ville den også generere et coredump men det gør den ikke mere, jeg slettede den gamle core fil i forhåbning om den bare ville oprette en ny.. noget man kan gøre for at sikre den skriver en core fil, til debugging brug ?
Avatar billede segmose Nybegynder
21. maj 2003 - 13:24 #15
du skal have skrive rettigheder der hvor den vil ligge core.
Avatar billede martinbk Nybegynder
21. maj 2003 - 13:31 #16
hmm dir'et er chmoddet 777 til den bruger der exekverer appen burde det ikke værre nok ?
Avatar billede martinbk Nybegynder
21. maj 2003 - 13:35 #17
men selvom jeg har gjort det får jeg stadig ingen core dump :(
Avatar billede segmose Nybegynder
21. maj 2003 - 14:23 #18
Nu kan jeg jo ikke lige huske hvor den ligger dumps som default og om man kan ændre det, har du logget på som en anden bruger? prøv at lave en tom coredump fil (samme navn) der hvor den lavede den sidste og sæt alle rettigheder (skrive er vigtigt) til denne fil.
Avatar billede martinbk Nybegynder
24. maj 2003 - 19:02 #19
har fået den til at generer core dump igen.. men jeg får stadig en underlig fejl ved at kører gdb på min core dump
#0  0x281009a0 in strcpy () from /usr/lib/libc.so.4
det sjove er den definerer jo ikke hvor det er galt.. nogen gode idéer ?
Avatar billede segmose Nybegynder
26. maj 2003 - 13:04 #20
Jeg ville gætte på en pointer fejl, har du allockeret noget til nick før første brug?
Har du nogen warnings?
prøv at se om du kan finde call stacken under GDB og se hvilken strcpy kald der er skyldig.
Avatar billede martinbk Nybegynder
16. juni 2003 - 05:30 #21
takker for indlægene alle sammen accepterer segmose og chries (da de er de eneste der har smidt et svar)
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