Isoc99_fscanf.c: File o directory non esistente.

di il
5 risposte

Isoc99_fscanf.c: File o directory non esistente.

Stavo debuggando con gdb, quando mi dà l'errore in titolo a questa riga:

x = fscanf(fin, "%s", r);

Cosa vuol dire quell'errore? Che non trova la funzione fscanf in libreria oppure che non trova il file fin?

5 Risposte

  • Re: Isoc99_fscanf.c: File o directory non esistente.

    Ciao Joker91,
    stai semplicemente cercando di debuggare le librerie sharate glibc, ma quest'ultime sono rilasciate senza simboli di debug.
  • Re: Isoc99_fscanf.c: File o directory non esistente.

    Come potrei risolvere quindi per debuggare un codice simile?
  • Re: Isoc99_fscanf.c: File o directory non esistente.

    Se vuoi debuggare la libreria sharata devi scaricartela.
    Ma ad intuito io credo tu non stia usando correttamente gdb. Se devi seguire un programma non devi fare STEP all'interno di una funzione che non ha simboli. Devi usare NEXT
    Exempio Sbagliato:
    
    (gdb) b main
    Breakpoint 1 at 0x40069f: file a.c, line 9.
    (gdb) lisy
    Undefined command: "lisy".  Try "help".
    (gdb) list
    1       #include <stdio.h>
    2
    3       int main ()
    4       {
    5         char buf[1024];
    6         FILE *fp;
    7         int x;
    8
    9         if (!(fp=fopen("foo.txt","r")))
    10        {
    (gdb) 
    11          perror ("fopen");
    12          return -1;
    13        }
    14
    15        while (!feof(fp))
    16        {
    17          x= fscanf(fp, "%s", buf);
    18        }
    19        fclose (fp);
    20        return 0;
    (gdb) run
    Starting program: /home/max/a.out 
    
    Breakpoint 1, main () at a.c:9
    9         if (!(fp=fopen("foo.txt","r")))
    (gdb) s
    _IO_new_fopen (filename=0x400816 "foo.txt", mode=0x400814 "r") at ../libio/iofopen.c:107
    107     ../libio/iofopen.c: No such file or directory.
            in ../libio/iofopen.c
    (gdb) 
    
    Esempio Corretto:
    
    max@studio:~> gdb ./a.out -q
    Reading symbols from /home/max/a.out...done.
    (gdb) list
    1       #include <stdio.h>
    2
    3       int main ()
    4       {
    5         char buf[1024];
    6         FILE *fp;
    7         int x;
    8
    9         if (!(fp=fopen("foo.txt","r")))
    10        {
    (gdb) 
    11          perror ("fopen");
    12          return -1;
    13        }
    14
    15        while (!feof(fp))
    16        {
    17          x= fscanf(fp, "%s", buf);
    18        }
    19        fclose (fp);
    20        return 0;
    (gdb) b main
    Breakpoint 1 at 0x40069f: file a.c, line 9.
    (gdb) run
    Starting program: /home/max/a.out 
    
    Breakpoint 1, main () at a.c:9
    9         if (!(fp=fopen("foo.txt","r")))
    (gdb) n
    15        while (!feof(fp))
    (gdb) quit
    A debugging session is active.
    
            Inferior 1 [process 12459] will be killed.
    
    Quit anyway? (y or n) 
    
  • Re: Isoc99_fscanf.c: File o directory non esistente.

    Ah giusto, con step è andato proprio dentro la funzione fscanf... Non ci avevo pensato.

    Una domanda: ho questo codice che apre un file con fopen... Come mai con DDD il debugging è molto lento a eseguire gli step mentre con gli altri debugger va normalmente?
  • Re: Isoc99_fscanf.c: File o directory non esistente.

    Come mai con DDD il debugging è molto lento a eseguire gli step mentre con gli altri debugger va normalmente?
    ddd è una GUI che utilizza X11 più un toolkit grafico. Il debugger rimane gdb (ma puoi usarne altri)
    E' un po' più lento in quanto si interfaccia sia con il server grafico sia con il debugger, ma è comodo. Se metti il breakpoint nel punto incriminato salti qualche input/output e risulta sicuramente più veloce rispetto ai NEXT/STEP
Devi accedere o registrarti per scrivere nel forum
5 risposte