ฉันรู้ว่าเราสามารถใช้คำสั่งต่างๆเพื่อเข้าถึงและอ่านหน่วยความจำได้เช่น print, p, x ...
แต่ฉันจะเปลี่ยนเนื้อหาของหน่วยความจำในตำแหน่งใดก็ได้ (ในขณะที่แก้ไขข้อบกพร่องใน GDB) ได้อย่างไร
ฉันรู้ว่าเราสามารถใช้คำสั่งต่างๆเพื่อเข้าถึงและอ่านหน่วยความจำได้เช่น print, p, x ...
แต่ฉันจะเปลี่ยนเนื้อหาของหน่วยความจำในตำแหน่งใดก็ได้ (ในขณะที่แก้ไขข้อบกพร่องใน GDB) ได้อย่างไร
คำตอบ:
วิธีที่ง่ายที่สุดคือการตั้งค่าตัวแปรโปรแกรม (ดูGDB: การกำหนด ):
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
หรือคุณสามารถอัปเดตตำแหน่ง (เขียนได้) โดยพลการตามที่อยู่:
(gdb) set {int}0x83040 = 4
set (str[6]) = 'c'
งานได้ในกรณีที่คุณมีอาร์เรย์เช่นchar str[]
ตามที่ Nikolai ได้กล่าวไว้คุณสามารถใช้คำสั่ง gdb 'set' เพื่อเปลี่ยนค่าของตัวแปรได้
คุณยังสามารถใช้คำสั่ง 'set' เพื่อเปลี่ยนตำแหน่งหน่วยความจำ เช่น. ขยายตัวอย่างของ 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
สิ่งนี้ควรใช้กับตัวชี้ที่ถูกต้องและสามารถส่งไปยังประเภทข้อมูลที่เหมาะสมได้
set {char[100]}(0x00) = ""
ล้างหน่วยความจำ 100 ไบต์ที่อยู่ 0x00
ขยายความเกี่ยวกับคำตอบที่ให้ไว้ที่นี่
คุณสามารถทำได้set idx = 1
เพื่อตั้งค่าตัวแปร แต่ไม่แนะนำให้ใช้ไวยากรณ์นั้นเนื่องจากชื่อตัวแปรอาจขัดแย้งกับคำสั่งย่อย set ตามตัวอย่างset w=1
จะไม่ถูกต้อง
ซึ่งหมายความว่าคุณควรชอบไวยากรณ์: set variable idx = 1
หรือset var idx = 1
.
สุดท้าย แต่ไม่ท้ายสุดคุณสามารถใช้คำสั่งพิมพ์เก่าที่เชื่อถือได้ของคุณเนื่องจากจะประเมินนิพจน์ ความแตกต่างเพียงอย่างเดียวคือเขายังพิมพ์ผลลัพธ์ของนิพจน์
(gdb) p idx = 1
$1 = 1