You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux环境下GDB无需指定end_addr转储未知大小数组内存可行吗?

GDB转储未知大小数组至未映射地址的实现方法

可行,你可以通过两种方式实现:手动查询内存映射边界,或者用GDB脚本自动探测最后有效地址,再执行dump命令。

方法一:手动查询内存映射(快捷方式)

因为你不介意额外转储部分内存,直接利用数组所在的内存区域映射边界即可:

  1. 先拿到数组的起始地址,比如通过p &your_array获取,记为start_addr。
  2. 在GDB中执行info proc mappings,输出会列出当前进程所有内存映射区域。
  3. 找到包含start_addr的那一行,取该行的End Addr作为结束地址end_addr。
  4. 执行dump命令:
    dump binary memory x.bin start_addr end_addr
    
    这样会转储整个内存区域,包含数组和区域内的其他内存,满足你的需求。

方法二:GDB脚本自动探测最后有效地址

如果需要更精准地停止在数组末尾(或最后可访问地址),可以用GDB的try/catch循环自动探测:

  1. 设置起始地址(替换成你的实际地址):
    set $start = 0x12345678
    set $end = $start
    
  2. 循环探测内存,直到访问失败:
    while 1
        try
            x /1x $end  # 尝试访问当前地址
            set $end = $end + 4  # 按4字节步长推进,可根据数组元素类型调整(char用1,long用8)
        catch
            set $end = $end - 4  # 回退到最后可访问的地址
            break
        end
    end
    
  3. 执行dump:
    dump binary memory x.bin $start $end
    

注意事项

  • try/catch需要GDB 7.0及以上版本支持。
  • 步长要匹配数组元素的大小,避免跳过有效地址或探测不准确。
  • 自动探测可能会慢一些,尤其是数组很大的时候,手动查映射边界更高效。

内容的提问来源于stack exchange,提问作者asdfldsfdfjjf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:27:42