2014-05-05 10 views
6

Próbuję więc debugować niektóre kod i wszystko, co mam, to plik wykonywalny. Wiem, że rejestr zawiera adres tego, co trzeba wiedzieć. Czy istnieje sposób, w jaki mogę wydrukować wartości heksadecymalne od początku tego adresu do określonej długości?dereferencing a register gdb

rzeczy próbowałem:

x/s $ebp 
p (char) ($ebp) 
p (char) (*ebp >> 4) 
p (char)*(%ebp 4) 
p $($ebp) 
p $(%ebp + $0x1) 

Czy normalny wskaźnik arytmetyka nie działać z rejestrów? Co to znaczy, gdy mówi, że”historia jest pusty

+0

Powiązane: http://stackoverflow.com/questions/12758217/printing-string-pointed-to-from-register-in-gdb –

Odpowiedz

7

Komenda x będzie najłatwiejszym sposobem wyświetlania wartości w pamięci Spróbuj na przykład:.

(gdb) x/32b $ebp 

Jeśli to nie zadziała (zwłaszcza jeśli pojawi się błąd, że "wartość nie może zostać przekonwertowana na liczbę całkowitą"), prawdopodobnie debugujesz 64-bitowy plik wykonywalny, a rejestry x86-64 mają różne nazwy, użyj zamiast tego $rbp.

Znaki po ukośniku w poleceniu x określ, ile wartości są wyświetlane i jaki format jest używany.spróbuje na przykład odczytać ciąg znaków z tego adresu. Jeśli nic nie używasz, gdb użyje tego, co ostatnio używałeś.

Chociaż nie jest to bezwzględnie konieczne, aby odpowiedzieć na pytanie, jakie stały się niektóre z innych komend, że próbujesz uruchomić:

p *((char *) $ebp)  <- treat $ebp as a character pointer and display what it points to 
p *((char *) $ebp + 4) <- with an offset 
p ((char *) $ebp)[4]  <- same thing as above, except using array syntax 

$ postać jest potrzebne tylko wtedy, gdy odnosi się do rejestrów, lub do zmiennych gdb. Nie potrzebujesz go do niczego innego.