Jak modyfikować zawartość pamięci za pomocą GDB?

87

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)?

bity
źródło
zapisz ciąg do pamięci: stackoverflow.com/questions/19503057/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

124

Najłatwiej jest ustawić zmienną programu (patrz GDB: przypisanie ):

Lub możesz po prostu zaktualizować dowolną (zapisywalną) lokalizację według adresu:

Jest więcej. Przeczytaj instrukcję .

Nikolai Fetissov
źródło
4
Muszę ustawić zmienną programu PRZED uzyskaniem dostępu do dowolnych lokalizacji pamięci? Czy nie mogę od razu uruchomić drugiego polecenia set?
Spidey
set (str[6]) = 'c'działa również, jeśli masz tablicę, na przykładchar str[]
xealits
30

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:

Powinno to działać dla każdego prawidłowego wskaźnika i może być rzutowane na dowolny odpowiedni typ danych.

Andrew Edgecombe
źródło
set {char[100]}(0x00) = ""Czyści 100 bajtów pamięci pod adresem 0x00
davenpcj
16

Poszerzanie odpowiedzi udzielonych tutaj.

Możesz po prostu set idx = 1ustawić zmienną, ale ta składnia nie jest zalecana, ponieważ nazwa zmiennej może kolidować z poleceniem podrzędnym set. Jako przykład set w=1nie byłby ważny.

Oznacza to, że powinieneś preferować składnię: set variable idx = 1lub 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.

Możesz przeczytać więcej o gdb tutaj .

João Portela
źródło