GDBを使用してメモリの内容を変更するにはどうすればよいですか?


87

いくつかのコマンドを使用してメモリにアクセスして読み取ることができることを知っています。たとえば、print、p、x ...

しかし、(GDBでのデバッグ中に)特定の場所でメモリの内容を変更するにはどうすればよいですか?


回答:


124

最も簡単なのは、プログラム変数を設定することです(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

まだまだあります。マニュアルをお読みください。


4
任意のメモリ位置にアクセスする前にプログラム変数を設定する必要がありますか?2番目のsetコマンドをすぐに実行することはできませんか?
スパイダーマン2012

また、次のset (str[6]) = 'c'ような配列がある場合は機能しますchar str[]
xealits

29

Nikolaiが言ったように、gdb'set 'コマンドを使用して変数の値を変更できます。

'set'コマンドを使用して、メモリの場所を変更することもできます。例えば。ニコライの例を拡張する:

(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) = ""アドレス0x00で100バイトのメモリをクリアします
davenpcj

16

ここで提供される回答を拡張します。

set idx = 1変数を設定することもできますが、変数名がsetサブコマンドと衝突する可能性があるため、この構文はお勧めしません。例としてset w=1は有効ではありません。

これは、構文を優先する必要があることを意味します:set variable idx = 1またはset var idx = 1

大事なことを言い忘れましたが、式を評価するので、信頼できる古いprintコマンドを使用できます。唯一の違いは、式の結果も出力することです。

(gdb) p idx = 1
$1 = 1

gdbの詳細については、こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.