gdb не может получить доступ к ошибке адреса памяти

вот мой код disas:

   0x0804844d <+0>:     push   %ebp
   0x0804844e <+1>:     mov    %esp,%ebp
   0x08048450 <+3>:     and    xfffffff0,%esp
   0x08048453 <+6>:     sub    x20,%esp
   0x08048456 <+9>:     movl   x8048540,(%esp)
   0x0804845d <+16>:    call   0x8048310 <puts@plt>
   0x08048462 <+21>:    lea    0x1c(%esp),%eax
   0x08048466 <+25>:    mov    %eax,0x4(%esp)
   0x0804846a <+29>:    movl   x8048555,(%esp)
   0x08048471 <+36>:    call   0x8048320 <scanf@plt>
   0x08048476 <+41>:    mov    0x1c(%esp),%eax
   0x0804847a <+45>:    cmp    x208c,%eax
   0x0804847f <+50>:    jne    0x804848f <main+66>
   0x08048481 <+52>:    movl   x8048558,(%esp)
   0x08048488 <+59>:    call   0x8048310 <puts@plt>
   0x0804848d <+64>:    jmp    0x804849b <main+78>
=> 0x0804848f <+66>:    movl   x8048569,(%esp)
   0x08048496 <+73>:    call   0x8048310 <puts@plt>
   0x0804849b <+78>:    mov    x0,%eax
   0x080484a0 <+83>:    leave  
   0x080484a1 <+84>:    ret 

что я Тринг, чтобы рассмотреть $0x208c. Когда я тип х/технические 0x208c это дает мне ошибку, которая говорит нет доступа к памяти в адрес 0x208c. Когда я тип информация регистрируется и посмотреть на еах это говорит о той стоимости, которую я предоставил. Поэтому в основном эта программа сравнивает два значения и в зависимости от этого что-то печатает.Проблема в том, что это домашнее задание из университета, и у меня нет кода. Надеюсь, вы сможете помочь. Спасибо.

3 ответов


когда я типа x/xw 0x208c это дает мне ошибку, которая говорит Cannot access memory at address 0x208c

разборки для вашей программы говорит, что она делает что-то вроде этого:

puts("some string");
int i;
scanf("%d", &i);  // I don't know what the actual format string is.
                  // You can find out with x/s 0x8048555
if (i == 0x208c) { ... } else { ... }

иными словами,0x208c значение (8332), что ваша программа имеет жесткий код в нем, и это не указатель. Поэтому GDB совершенно правильно говорит вам, что если вы интерпретируете 0x208c в качестве указателя этот указатель не указывает на читаемый память.

я, наконец, понял, чтобы использовать оператор печати вместо x / xw

Вы кажется не понимаете разницу между print и examine команды. Рассмотрим следующий пример:

int foo = 42;
int *pfoo = &foo;

С, print pfoo даст вам адрес of foo и x pfoo даст вам стоимостью хранящиеся по этому адресу (т. е. значение foo).


я выяснил, что нельзя исследовать mmaped память, которая не имеет PROT_READ флаг. Это не проблема OPs, но это было мое, и сообщение об ошибке то же самое.

вместо

mmap(0, size, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);

do

mmap(0, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);

и вуаля, память можно исследовать.


неинициализированные указатели

это очевидно в ретроспективе, но это то, что заставляло GDB показывать мне это сообщение об ошибке. Вместе:

#include <stdio.h>

int main(void) {
    int *p;
    printf("*p = %d\n", *p);
}

и затем:

gdb -q -nh -ex run ./tmp.out
Reading symbols from ./tmp.out...done.
Starting program: /home/ciro/bak/git/cpp-cheat/gdb/tmp.out 

Program received signal SIGSEGV, Segmentation fault.
0x0000555555554656 in main () at tmp.c:5
5           printf("*p = %d\n", *p);
(gdb) print *p
Cannot access memory at address 0x0

но в сложной программе, конечно, и где адрес был чем-то случайным, отличным от нуля.