2014-07-21 15 views
5

Quindi, sto imparando come programmare in C, e sto avendo (o ad elast, provando a) divertirmi con GDB.GDB <Indirizzo 0xblablabla fuori limite> errore

Così ho scritto questo semplice codice:

#include <stdio.h> 

int main (int argc, char *argv[]){ 

int i; 

int n = atoi(argv[2]); 

for (i=0; i<n ; i++){ 
    printf("%s \n",i+1,argv[1]); // prints the string provided in 
}        // the arguments for n times 
return 0; 
} 

e stavo cercando di usd GDB per ottenere alcune informazioni su di esso. Così ho usato per cercare di ottenere gli argomenti da indirizzi di memoria, ma questo è ciò che ottengo:

(gdb) break main 
Breakpoint 1 at 0x4005d7: file repeat2.c, line 14. 
(gdb) break 17 
Breakpoint 2 at 0x40062c: file repeat2.c, line 17. 
(gdb) run hello 5 
Starting program: /root/Scrivania/Programmazione/repeat2 hello 5 
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000 

Breakpoint 1, main (argc=3, argv=0x7fffffffe948) at repeat2.c:14 
14  int n = atoi(argv[2]); 
(gdb) cont 
Continuing. 
1 ------>  hello 
2 ------>  hello 
3 ------>  hello 
4 ------>  hello 
5 ------>  hello 

Breakpoint 2, main (argc=3, argv=0x7fffffffe948) at repeat2.c:18 
18 return 0; 
(gdb) x/3xw 0x7fffffffe948  (I try to read what argv contains) 
0x7fffffffe948: 0xffffebbc 0x00007fff 0xffffebe3 
(gdb) x/s 0xffffebbc   (I try to read one of the argoments in the array) 
0xffffebbc: <Address 0xffffebbc out of bounds> 

Perché continuo a ricevere questo errore? Sono su un 64-bit, e sto usando Kali Linux

Il programma, se compilato, funziona, è solo che non riesco a capire perché non riesco a leggere quei valori con GDB.

risposta

3

@DrakaSAN trovato il bug nel programma. Come per la domanda gdb:

x/3xw stampa 3 parole a 4 byte. argv è una matrice di puntatori char *. Dal momento che siete su un sistema a 64 bit, i puntatori sono 8 byte, così invece di w si desidera utilizzare g (gigante, 8 byte) o a (indirizzo), che selezionerà il formato corretto automaticamente:

(gdb) break 7 
Breakpoint 1 at 0x40058c: file repeat2.c, line 7. 
(gdb) run hello 5 
Starting program: /tmp/repeat2 hello 5 

Breakpoint 1, main (argc=3, argv=0x7fffffffdfe8) at repeat2.c:7 
7 int n = atoi(argv[2]); 
(gdb) x/3xg 0x7fffffffdfe8 
0x7fffffffdfe8: 0x00007fffffffe365 0x00007fffffffe372 
0x7fffffffdff8: 0x00007fffffffe378 
(gdb) x/3xa 0x7fffffffdfe8 
0x7fffffffdfe8: 0x7fffffffe365 0x7fffffffe372 
0x7fffffffdff8: 0x7fffffffe378 
(gdb) x/s 0x7fffffffe365 
0x7fffffffe365: "/tmp/repeat2" 
(gdb) x/s 0x7fffffffe372 
0x7fffffffe372: "hello" 
(gdb) x/s 0x7fffffffe378 
0x7fffffffe378: "5" 

Grazie a @adpeace per aver suggerito il modificatore a.

+0

Grazie mille, stavo seguendo un libro scritto per una macchina a 32 bit! – DoubleCat

1

Benvenuti in SO, +1 per fare una prima domanda.

printf("%s \n",i+1,argv[1]); 

Si tenta di inserire un (i) int quando printf prevede una stringa (% s). Penso che quello che volevo fare era:

for (i=0; i<n ; i++) 
{ 
    printf("%s \n", argv[1]); 
} 

Althought, I m ha sorpreso il compilatore didn t urlare a voi per questo.

(Come nota a ... Kali Linux isn t dovrebbe essere utilizzato come un sistema operativo di sviluppo, si consiglia di utilizzare una Debian o Ubuntu ...)

+0

No, volevo stampare il primo argomento (una stringa) che l'utente avrebbe inserito. Il programma dovrebbe funzionare così: "./program" word "5" e stamperà sullo schermo 5 volte la stringa "word". Io lavoro, è solo che non riesco a leggere i valori su GDB (Ho avuto problemi con GRUB e UEFI, e kali era l'unico sistema operativo che avevo su un cd che funzionava, quindi ho deciso di seguirlo Ora sono troppo pigro per tornare a Ubuntu) – DoubleCat

+0

@DoubleCat: la modifica per fare ciò che volevi era semplice, solo argv [1] invece di argv [i]. Ancora, prova ad aggiornare gcc, il tuo codice non dovrebbe essere compilato. – DrakaSAN

Problemi correlati