いくつかのコマンドを使用してメモリにアクセスして読み取ることができることを知っています。たとえば、print、p、x ...
しかし、(GDBでのデバッグ中に)特定の場所でメモリの内容を変更するにはどうすればよいですか?
回答:
set (str[6]) = 'c'
ような配列がある場合は機能しますchar str[]
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バイトのメモリをクリアします
ここで提供される回答を拡張します。
set idx = 1
変数を設定することもできますが、変数名がsetサブコマンドと衝突する可能性があるため、この構文はお勧めしません。例としてset w=1
は有効ではありません。
これは、構文を優先する必要があることを意味します:set variable idx = 1
またはset var idx = 1
。
大事なことを言い忘れましたが、式を評価するので、信頼できる古いprintコマンドを使用できます。唯一の違いは、式の結果も出力することです。
(gdb) p idx = 1
$1 = 1
gdbの詳細については、こちらをご覧ください。