2014-07-21 7 views
5

Tak, uczę się programowania w C, i mam (lub elastycznie, starając się) zabawę z GDB.GDB <Adres 0xblablabla out of bounds> error

Więc napisałem ten prosty kod:

#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; 
} 

i starałem USD GDB aby uzyskać pewne infos na nim. Więc użyłem go, aby spróbować i dostać argumenty z adresami pamięci, ale to, co mam:

(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> 

Dlaczego wciąż otrzymuję ten błąd? Jestem na 64-bitowym i używam Kali Linux

Program, jeśli jest skompilowany, działa, po prostu nie mogę zrozumieć, dlaczego nie mogę odczytać tych wartości za pomocą GDB.

Odpowiedz

3

@DrakaSAN znalazłeś błąd w programie. Jeśli chodzi o twoje pytanie gdb:

x/3xw wypisuje 3 4-bajtowe słowa. argv to tablica wskaźników char *. Skoro jesteś na systemie 64-bitowym, wskaźniki są 8 bajtów, więc zamiast w chcesz użyć g (olbrzym, 8 bajtów) lub a (adres), który będzie wybrać odpowiedni rozmiar się automatycznie:

(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" 

Dzięki @adpeace za sugerowanie modyfikatora a.

+0

Wielkie dzięki, śledziłem książkę napisaną dla maszyny 32-bitowej! – DoubleCat

1

Witaj w SO, +1 za dobrze zadane pierwsze pytanie.

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

Próbujesz umieścić int (i), gdy printf oczekuje ciągu (% s). myślę, co chciałem zrobić, to:

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

Althought, I m zaskoczony kompilator didn t krzyczeć na ciebie za to.

(Na marginesie ... Kali Linux isn t powinien być stosowany jako OS rozwoju, może chcesz używać Debiana lub Ubuntu ...)

+0

Nie, chciałem wydrukować pierwszy argument (ciąg znaków), który użytkownik umieściłby. Program powinien działać w następujący sposób: "./program" słowo "5" i będzie drukować na ekranie 5 razy ciąg "słowo". Pracuję, po prostu nie mogę odczytać wartości na GDB (miałem problemy z GRUB-em i UEFI, a kali był jedynym systemem, który miałem na płycie, która działała, więc zdecydowałem się z tym Teraz jestem po prostu zbyt leniwy, aby powrócić do Ubuntu) – DoubleCat

+0

@DoubleCat: Edycja, aby zrobić to, co chciałeś była prosta, po prostu argv [1] zamiast argv [i]. Mimo to spróbuj zaktualizować gcc, twój kod nie powinien się skompilować. – DrakaSAN

Powiązane problemy