Linux环境下GDB无需指定end_addr转储未知大小数组内存可行吗?
GDB转储未知大小数组至未映射地址的实现方法
可行,你可以通过两种方式实现:手动查询内存映射边界,或者用GDB脚本自动探测最后有效地址,再执行dump命令。
方法一:手动查询内存映射(快捷方式)
因为你不介意额外转储部分内存,直接利用数组所在的内存区域映射边界即可:
- 先拿到数组的起始地址,比如通过
p &your_array获取,记为start_addr。 - 在GDB中执行
info proc mappings,输出会列出当前进程所有内存映射区域。 - 找到包含
start_addr的那一行,取该行的End Addr作为结束地址end_addr。 - 执行dump命令:
这样会转储整个内存区域,包含数组和区域内的其他内存,满足你的需求。dump binary memory x.bin start_addr end_addr
方法二:GDB脚本自动探测最后有效地址
如果需要更精准地停止在数组末尾(或最后可访问地址),可以用GDB的try/catch循环自动探测:
- 设置起始地址(替换成你的实际地址):
set $start = 0x12345678 set $end = $start - 循环探测内存,直到访问失败:
while 1 try x /1x $end # 尝试访问当前地址 set $end = $end + 4 # 按4字节步长推进,可根据数组元素类型调整(char用1,long用8) catch set $end = $end - 4 # 回退到最后可访问的地址 break end end - 执行dump:
dump binary memory x.bin $start $end
注意事项
try/catch需要GDB 7.0及以上版本支持。- 步长要匹配数组元素的大小,避免跳过有效地址或探测不准确。
- 自动探测可能会慢一些,尤其是数组很大的时候,手动查映射边界更高效。
内容的提问来源于stack exchange,提问作者asdfldsfdfjjf
相关产品推荐
相关产品推荐

