2015-03-29 4 views
0

Я не знаю, является ли это широким вопросом или нет, но мне сложно найти строки векторов аргументов. Вот мой вывод GDB.Intel Assembly не может найти адрес Argv

(gdb) run test 
Starting program: /root/Desktop/booksrc/a.out test 
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000 

Breakpoint 1, main (argc=2, argv=0x7fffffffe468) at convert2.c:14 
14  count = atoi(argv[2]); // convert the 2nd arg into an integer 
(gdb) x/3xw 0x7fffffffe468 
0x7fffffffe468: 0xffffe6d2 0x00007fff 0xffffe6ee 
(gdb) x/3xw 0xffffe6d2 
0xffffe6d2: Cannot access memory at address 0xffffe6d2 
(gdb) x/3xw 0x00007fff 
0x7fff: Cannot access memory at address 0x7fff 

Так что должно быть моим первым аргументом, /root/Desktop/booksrc/a.out недостижим, а также тест аргумент. Что дает?

+0

Вы находитесь в режиме 64 бит, ваши указатели 64 бит. В любом случае вы можете просто «p argv [2]» и забыть об этой детали. – Jester

+0

Источник, который я читаю, использует 32 бит. Однако почему адреса недоступны? Это вопрос форматирования? – WhiteMask

+2

Недостаток, потому что вы использовали только низкую половину из них. Если вы хотите играть в 32-битном режиме, скомпилируйте с помощью 'gcc -m32'. – Jester

ответ

0

Вы должны использовать g вместо w в вашей команде. g означает «гигант» или 8bytes, и так как ваш на 64-битной машине, вместо x/3xw вы хотите x/3xg, и вы получите что-то вроде этого:

(gdb) x/3xg 0x7fff5fbff900 
0x7fff5fbff900: 0x00007fff5fbffa38 0x00007fff5fbffa6a 
0x7fff5fbff910: 0x0000000000000000 

Тогда x/s 0x00007fff5fbffa38 и вы увидите ARGV аргумент, который является путь вашей программы, а второй 0x00007fff5fbffa6a - это «тест».

Смежные вопросы