如何使用GDB修改内存内容?

bit*_*its 77 c linux memory gdb

我知道我们可以使用几个命令来访问和读取内存:例如,print,p,x ......

但是如何在任何特定位置更改内存的内容(在GDB中调试时)?

Nik*_*sov 108

最简单的是设置程序变量(参见GDB:赋值):

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
Run Code Online (Sandbox Code Playgroud)

或者您可以按地址更新任意(可写)位置:

(gdb) set {int}0x83040 = 4
Run Code Online (Sandbox Code Playgroud)

还有更多.阅读手册.

  • 我需要在访问任意内存位置之前设置程序变量吗?我不能马上运行第二套命令吗? (4认同)
  • 是的,您可以在没有第一个的情况下运行第二个set命令. (4认同)
  • 另外,如果你有一个数组,比如“char str[]”,“set (str[6]) = 'c'”也可以工作。 (2认同)

And*_*mbe 27

正如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
Run Code Online (Sandbox Code Playgroud)

这应该适用于任何有效的指针,并且可以转换为任何适当的数据类型.

  • `set {char[100]}(0x00) = ""` 清除地址 0x00 处的 100 字节内存 (3认同)

Joã*_*ela 14

扩展此处提供的答案.

您可以set idx = 1设置变量,但不建议使用该语法,因为变量名称可能与set子命令冲突.作为一个例子set w=1是无效的.

这意味着您应该更喜欢语法:set variable idx = 1set var idx = 1.

最后但并非最不重要的是,您可以使用可靠的旧打印命令,因为它会评估表达式.唯一的区别是他还打印了表达式的结果.

(gdb) p idx = 1
$1 = 1
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多关于gdb的信息.


Jaa*_*kko 5

书写记忆:

(gdb) set *0x20001234 = 0xABABABAB
Run Code Online (Sandbox Code Playgroud)

读记忆:

(gdb) x 0x20001234
0x20001234:     0xabababab
Run Code Online (Sandbox Code Playgroud)