Wiem, że możemy użyć kilku poleceń, aby uzyskać dostęp i odczytać pamięć: na przykład print, p, x ...
Ale jak mogę zmienić zawartość pamięci w dowolnym określonym miejscu (podczas debugowania w GDB)?
Wiem, że możemy użyć kilku poleceń, aby uzyskać dostęp i odczytać pamięć: na przykład print, p, x ...
Ale jak mogę zmienić zawartość pamięci w dowolnym określonym miejscu (podczas debugowania w GDB)?
Odpowiedzi:
Najłatwiej jest ustawić zmienną programu (patrz GDB: przypisanie ):
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
Lub możesz po prostu zaktualizować dowolną (zapisywalną) lokalizację według adresu:
(gdb) set {int}0x83040 = 4
Jest więcej. Przeczytaj instrukcję .
set (str[6]) = 'c'
działa również, jeśli masz tablicę, na przykładchar str[]
Jak powiedział Nikolai, możesz użyć polecenia gdb 'set', aby zmienić wartość zmiennej.
Możesz także użyć polecenia „set”, aby zmienić lokalizacje pamięci. na przykład. Rozwijając przykład Mikołaja:
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
(gdb) p &i
$2 = (int *) 0xbfbb0000
(gdb) set *((int *) 0xbfbb0000) = 20
(gdb) p i
$3 = 20
Powinno to działać dla każdego prawidłowego wskaźnika i może być rzutowane na dowolny odpowiedni typ danych.
set {char[100]}(0x00) = ""
Czyści 100 bajtów pamięci pod adresem 0x00
Poszerzanie odpowiedzi udzielonych tutaj.
Możesz po prostu set idx = 1
ustawić zmienną, ale ta składnia nie jest zalecana, ponieważ nazwa zmiennej może kolidować z poleceniem podrzędnym set. Jako przykład set w=1
nie byłby ważny.
Oznacza to, że powinieneś preferować składnię: set variable idx = 1
lub set var idx = 1
.
Wreszcie, możesz po prostu użyć swojego zaufanego starego polecenia drukowania, ponieważ ocenia ono wyrażenie. Jedyną różnicą jest to, że drukuje również wynik wyrażenia.
(gdb) p idx = 1
$1 = 1
Możesz przeczytać więcej o gdb tutaj .