web-dev-qa-db-ja.com

GDBを使用してメモリの内容を変更する方法は?

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

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

73
bits

最も簡単なのは、プログラム変数を設定することです( GDB:assignment を参照):

(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

他にもあります。 マニュアル を読んでください。

104

ニコライが言ったように、変数の値を変更するには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

これは任意の有効なポインターに対して機能するはずであり、適切なデータ型にキャストできます。

25

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

あなたはただset idx = 1を使用して変数を設定しますが、変数名がsetサブコマンドと衝突する可能性があるため、その構文は推奨されません。例としてset w=1は無効です。

これは、構文set variable idx = 1 または set var idx = 1

最後になりましたが、式を評価するため、信頼できる古い印刷コマンドを使用できます。唯一の違いは、式の結果も出力することです。

(gdb) p idx = 1
$1 = 1

Gdb here の詳細を読むことができます。

13
João Portela