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后再取地址。