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

gdb中xb命令输出换行、带地址及长度限制问题咨询

GDB 十六进制输出优化及自定义命令报错解决方案

无地址前缀、单行输出指定长度十六进制字节

你之前执行set width unlimited不生效的原因是部分GDB版本不识别unlimited作为宽度参数的取值,需要用set width 0替代,同时还要配合另外两个配置项才能完全关闭折行和地址前缀:

  • 先执行三条全局配置命令:
    # 关闭输出中的地址前缀显示
    set print address off
    # 解除数组/序列输出的元素数量限制
    set print elements 0
    # 解除输出宽度限制,替代部分版本不兼容的set width unlimited
    set width 0
    

配置完成后直接使用x/<长度>bx <目标地址>命令即可输出无地址前缀的单行十六进制内容,例如输出0x402000地址开始的20个字节:x/20bx 0x402000。

如果不想修改全局配置,可以使用自定义专用命令的方案,调用时不会影响其他输出逻辑:

# 定义一次性输出无格式原始十六进制的命令
define xb_raw
  set $byte_len = $arg0
  set $start_addr = (unsigned char*)$arg1
  set $idx = 0
  while $idx < $byte_len
    printf "%02x ", $start_addr[$idx]
    set $idx = $idx + 1
  end
  printf "\n"
end
# 命令说明
document xb_raw
用法:xb_raw <字节数> <起始地址>
输出起始地址开始指定数量的原始十六进制字节,无额外前缀,单行输出
end

使用示例:xb_raw 64 0x7fffffffdc00 即可输出起始地址0x7fffffffdc00开始的64个原始十六进制字节。

cannot subscript something of type 'long' 报错原因

该错误是自定义xb命令时的常见类型错误:你在命令逻辑中直接对传入的地址参数执行了下标取值操作(例如$addr[0]),但GDB默认把输入的地址数值解析为long类型的标量,不是指针类型,不支持下标访问语法。
修复方法只需要在定义命令时,先把传入的地址参数强制转换为指针类型即可,比如上述自定义命令中的set $start_addr = (unsigned char*)$arg1语句,转换后再执行下标访问就不会触发类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:00:02