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
相关产品推荐
相关产品推荐

