3. GDB内存查看与修改

任务目标

编写一个包含全局变量和数组的C程序,使用GDB的x命令查看指定内存地址的内容,使用set命令修改内存值,并观察修改后程序执行结果的变化。

环境准备

需要GCC和GDB,Linux环境自带或通过apt install gdb gcc安装。创建以下源文件:

// mem_demo.c
#include <stdio.h>

int global_var = 100;
int arr[5] = {10, 20, 30, 40, 50};

int main() {
    int local_var = 7;
    printf("global_var = %d\n", global_var);
    printf("arr[2] = %d\n", arr[2]);
    printf("local_var = %d\n", local_var);
    return 0;
}

编译与启动调试

gcc -g -o mem_demo mem_demo.c
gdb ./mem_demo

GDB操作步骤

在GDB提示符下依次执行以下命令:

(gdb) break main
(gdb) run
(gdb) print &global_var
(gdb) print &arr
(gdb) print &local_var

记录输出的三个地址。然后使用x命令查看内存内容:

(gdb) x/wd &global_var
(gdb) x/5wd &arr
(gdb) x/wd &local_var

x/wd表示以十进制格式查看一个字(4字节),x/5wd查看连续5个字。此时应看到:global_var为100,arr依次为10、20、30、40、50,local_var为7。

修改内存值

使用set命令修改内存:

(gdb) set {int}&global_var = 999
(gdb) set {int}&arr[2] = 300
(gdb) set {int}&local_var = 77

再次用x命令确认修改生效:

(gdb) x/wd &global_var
(gdb) x/5wd &arr
(gdb) x/wd &local_var

此时应分别显示999、300、77。继续执行程序:

(gdb) continue

验证与判定标准

程序输出应为:

global_var = 999
arr[2] = 300
local_var = 77

若输出与上述一致,说明x命令正确查看了内存内容,set命令成功修改了内存值,且修改对程序执行产生了预期影响。注意:local_var位于栈上,修改其值在main函数内有效;global_var和arr位于数据段,修改后在整个程序生命周期内生效。

常见问题

  • 若x命令显示格式不对,检查是否使用了正确的格式字符(d十进制、x十六进制、c字符)。
  • 修改内存时{int}是必需的强制类型转换,告诉GDB按int大小写入,否则可能因类型不匹配导致写入字节数错误。
  • 若在main之前打断点,local_var尚未分配,需在进入main后再取地址。