จะแก้ไขเนื้อหาหน่วยความจำโดยใช้ GDB ได้อย่างไร


87

ฉันรู้ว่าเราสามารถใช้คำสั่งต่างๆเพื่อเข้าถึงและอ่านหน่วยความจำได้เช่น print, p, x ...

แต่ฉันจะเปลี่ยนเนื้อหาของหน่วยความจำในตำแหน่งใดก็ได้ (ในขณะที่แก้ไขข้อบกพร่องใน GDB) ได้อย่างไร


เขียนสตริงลงในหน่วยความจำ: stackoverflow.com/questions/19503057/…
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


124

วิธีที่ง่ายที่สุดคือการตั้งค่าตัวแปรโปรแกรม (ดูGDB: การกำหนด ):

หรือคุณสามารถอัปเดตตำแหน่ง (เขียนได้) โดยพลการตามที่อยู่:

ยังมีอีก. อ่านคู่มือการใช้งาน


4
ฉันจำเป็นต้องตั้งค่าตัวแปรของโปรแกรมก่อนที่จะเข้าถึงตำแหน่งหน่วยความจำโดยพลการ? ฉันไม่สามารถเรียกใช้คำสั่งชุดที่สองได้ทันทีหรือไม่
Spidey

ยังใช้set (str[6]) = 'c'งานได้ในกรณีที่คุณมีอาร์เรย์เช่นchar str[]
xealits

30

ตามที่ Nikolai ได้กล่าวไว้คุณสามารถใช้คำสั่ง gdb 'set' เพื่อเปลี่ยนค่าของตัวแปรได้

คุณยังสามารถใช้คำสั่ง 'set' เพื่อเปลี่ยนตำแหน่งหน่วยความจำ เช่น. ขยายตัวอย่างของ Nikolai:

สิ่งนี้ควรใช้กับตัวชี้ที่ถูกต้องและสามารถส่งไปยังประเภทข้อมูลที่เหมาะสมได้


set {char[100]}(0x00) = ""ล้างหน่วยความจำ 100 ไบต์ที่อยู่ 0x00
davenpcj

16

ขยายความเกี่ยวกับคำตอบที่ให้ไว้ที่นี่

คุณสามารถทำได้set idx = 1เพื่อตั้งค่าตัวแปร แต่ไม่แนะนำให้ใช้ไวยากรณ์นั้นเนื่องจากชื่อตัวแปรอาจขัดแย้งกับคำสั่งย่อย set ตามตัวอย่างset w=1จะไม่ถูกต้อง

ซึ่งหมายความว่าคุณควรชอบไวยากรณ์: set variable idx = 1หรือset var idx = 1.

สุดท้าย แต่ไม่ท้ายสุดคุณสามารถใช้คำสั่งพิมพ์เก่าที่เชื่อถือได้ของคุณเนื่องจากจะประเมินนิพจน์ ความแตกต่างเพียงอย่างเดียวคือเขายังพิมพ์ผลลัพธ์ของนิพจน์

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ gdb ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.