Saya tahu bahwa kita dapat menggunakan beberapa perintah untuk mengakses dan membaca memori: misalnya, print, p, x ...
Tetapi bagaimana saya bisa mengubah isi memori di lokasi tertentu (saat debugging di GDB)?
Saya tahu bahwa kita dapat menggunakan beberapa perintah untuk mengakses dan membaca memori: misalnya, print, p, x ...
Tetapi bagaimana saya bisa mengubah isi memori di lokasi tertentu (saat debugging di GDB)?
Jawaban:
Yang paling mudah adalah menyetel variabel program (lihat GDB: penugasan ):
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
Atau Anda bisa memperbarui lokasi sewenang-wenang (dapat ditulis) berdasarkan alamat:
(gdb) set {int}0x83040 = 4
Masih ada lagi. Baca manualnya .
set (str[6]) = 'c'
berfungsi, jika Anda memiliki array, sepertichar str[]
Seperti yang dikatakan Nikolai, Anda dapat menggunakan perintah gdb 'set' untuk mengubah nilai variabel.
Anda juga dapat menggunakan perintah 'set' untuk mengubah lokasi memori. misalnya. Memperluas contoh Nikolai:
(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
Ini harus bekerja untuk semua penunjuk yang valid, dan dapat ditransmisikan ke tipe data yang sesuai.
set {char[100]}(0x00) = ""
Menghapus 100 byte memori di alamat 0x00
Memperluas jawaban yang diberikan di sini.
Anda bisa saja melakukan set idx = 1
untuk mengatur variabel, tetapi sintaks itu tidak disarankan karena nama variabel mungkin bentrok dengan sub-perintah yang ditetapkan. Sebagai contoh set w=1
tidak akan valid.
Ini berarti Anda harus memilih sintaks: set variable idx = 1
atau set var idx = 1
.
Last but not least, Anda bisa menggunakan perintah print lama terpercaya Anda, karena ini mengevaluasi ekspresi. Satu-satunya perbedaan adalah dia juga mencetak hasil ekspresi.
(gdb) p idx = 1
$1 = 1
Anda dapat membaca lebih lanjut tentang gdb di sini .