调试C程序时,如何将指定内存地址的字符串存入GDB便利变量?
在GDB中将内存中的字符串存入便利变量
要把已知内存地址处的以\0结尾的字符串存入GDB便利变量(而非仅存储地址),可以借助C标准库函数复制字符串内容,具体方法如下:
方法一:使用strdup直接复制(推荐)
strdup函数会自动分配堆内存,并将目标地址的字符串完整复制到新内存中,返回新内存的指针。执行以下命令即可:
set $string_variable = strdup((char *)0xAAAAAAAA)
验证效果
- 查看便利变量指向的字符串:
print (char *) $string_variable,会输出"hello_world" - 用内存查看命令确认:
x/s $string_variable,同样会显示完整字符串
这种方式下,$string_variable指向的是原字符串的副本,原内存地址的内容修改不会影响该便利变量的取值。
方法二:手动分配内存+复制(兼容性更强)
如果环境中无法直接使用strdup,可以拆分步骤,用malloc分配内存,再用strcpy复制内容:
# 1. 获取目标字符串的长度(含末尾\0) set $str_len = strlen((char *)0xAAAAAAAA) + 1 # 2. 分配足够的内存 set $string_variable = malloc($str_len) # 3. 复制字符串内容到新内存 call strcpy($string_variable, (char *)0xAAAAAAAA)
注意事项
- 以上方法依赖C标准库,确保调试的程序已链接标准库(绝大多数C程序默认满足)
- 若不再需要该便利变量,可调用
free($string_variable)释放分配的堆内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者cerveka2
相关产品推荐
相关产品推荐

