Belleğe erişmek ve okumak için birkaç komut kullanabileceğimizi biliyorum: örneğin, yazdır, p, x ...
Ancak herhangi bir özel konumdaki bellek içeriğini nasıl değiştirebilirim (GDB'de hata ayıklarken)?
Belleğe erişmek ve okumak için birkaç komut kullanabileceğimizi biliyorum: örneğin, yazdır, p, x ...
Ancak herhangi bir özel konumdaki bellek içeriğini nasıl değiştirebilirim (GDB'de hata ayıklarken)?
Yanıtlar:
En kolayı bir program değişkeni ayarlamaktır (bkz. GDB: atama ):
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
Veya isteğe bağlı (yazılabilir) konumu adrese göre güncelleyebilirsiniz:
(gdb) set {int}0x83040 = 4
Fazlası var. Kılavuzu okuyun .
set (str[6]) = 'c'
bir diziniz olması durumunda çalışır, örneğinchar str[]
Nikolai'nin dediği gibi, bir değişkenin değerini değiştirmek için gdb 'set' komutunu kullanabilirsiniz.
Bellek konumlarını değiştirmek için 'set' komutunu da kullanabilirsiniz. Örneğin. Nikolai'nin örneğini genişleterek:
(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
Bu, herhangi bir geçerli işaretçi için çalışmalıdır ve herhangi bir uygun veri türüne dönüştürülebilir.
set {char[100]}(0x00) = ""
0x00 adresindeki 100 bayt belleği temizler
Burada verilen cevapların genişletilmesi.
Sadece set idx = 1
bir değişken ayarlamak için yapabilirsiniz , ancak bu sözdizimi önerilmez çünkü değişken adı bir set alt komutuyla çakışabilir. Örnek set w=1
olarak geçerli olmaz.
Bu, sözdizimini tercih etmeniz gerektiği anlamına gelir: set variable idx = 1
veya set var idx = 1
.
Son olarak, bir ifadeyi değerlendirdiği için güvenilir eski yazdırma komutunuzu kullanabilirsiniz. Tek fark, ifadenin sonucunu da yazdırmasıdır.
(gdb) p idx = 1
$1 = 1
Sen gdb hakkında daha fazla bilgi bulabilirsiniz burada .