添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

但是我怎样才能改变任何特定位置的内存内容(在GDB中调试时)?

c
linux
memory
gdb
bits
bits
发布于 2010-07-22
5 个回答
Nikolai Fetissov
Nikolai Fetissov
发布于 2021-11-23
已采纳
0 人赞同

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

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

或者你可以直接按地址更新任意的(可写的)位置。

(gdb) set {int}0x83040 = 4

还有更多。阅读手册.

我确实需要在访问任意的内存位置之前设置一个程序变量?难道我就不能马上运行第二个set命令吗?
另外, set (str[6]) = 'c' 也可以,如果你有一个数组,比如 char str[]
我正在调试汇编代码(arm64)。要在地址0x6000000处写入0x1234,执行 set *((unsigned int)0x6000000) = 0x1234
Andrew Edgecombe
Andrew Edgecombe
发布于 2021-11-23
0 人赞同

正如Nikolai所说,你可以用gdb的'set'命令来改变一个变量的值。

你也可以使用'set'命令来改变内存位置。 例如。在Nikolai的例子上展开。

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
(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

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

替换代码0清除地址为0x00的100个字节的内存
João Portela
João Portela
发布于 2021-11-23
0 人赞同

在这里提供的答案的基础上进行扩展。

你可以直接用 set idx = 1 来设置一个变量,但不建议使用这种语法,因为变量名称可能与设置子命令冲突。例如, set w=1 就不是有效的。

这意味着,你应该更倾向于使用这样的语法。 set variable idx = 1 set var idx = 1

最后但并非最不重要的是,你可以直接使用你可信赖的老式打印命令,因为它评估了一个表达式。唯一的区别是,他还会打印表达式的结果。

(gdb) p idx = 1
$1 = 1

你可以阅读更多关于gdb的信息here.

Jaakko
Jaakko
发布于 2021-11-23
0 人赞同

Writing memory:

(gdb) set *0x20001234 = 0xABABABAB

阅读记忆。

(gdb) x 0x20001234
0x20001234:     0xabababab
    
BoRRis
BoRRis
发布于 2021-11-23
0 人赞同

最有用的事情之一是直接改变寄存器的值。