GDB如何以单字节模式打印十六进制数组并将内容输出在同一行
GDB单字节十六进制同屏输出解决方法
你可以通过修改GDB输出配置或者自定义命令实现需求,具体操作如下:
方法1:临时修改输出宽度(单次生效)
GDB默认会按照终端宽度自动对x命令的输出换行,你可以先将输出宽度设置为0禁用自动换行,再执行单字节打印命令即可:
# 禁用自动换行,0代表输出不限制宽度 (gdb) set width 0 # 执行单字节打印命令 (gdb) x/20xb 0x00007ffff7e84000
输出效果如下:
0x7ffff7e84000 <opendir>: 0xf3 0x0f 0x1e 0xfa 0x41 0x55 0x41 0x54 0x55 0x53 0x48 0x81 0xec 0xa8 0x00 0x00 0x00 0x64 0x48 0x8b
如果需要恢复默认换行逻辑,执行set width auto即可。
方法2:永久配置(每次启动GDB自动生效)
将禁用自动换行的配置写入GDB初始化文件~/.gdbinit,后续打开GDB无需重复执行设置命令:
# 终端执行写入配置 echo "set width 0" >> ~/.gdbinit
方法3:自定义打印命令(无地址前缀,纯字节输出)
如果你不需要输出地址、函数名前缀,只需要纯十六进制字节内容,可以在GDB中定义自定义命令:
# 在GDB中输入以下内容定义自定义命令x1,两个参数分别为起始地址、打印字节数 define x1 set $addr = $arg0 set $len = $arg1 set $i = 0 while $i < $len printf "0x%02x ", *(unsigned char*)($addr + $i) set $i = $i + 1 end printf "\n" end
使用时直接调用即可:
(gdb) x1 0x00007ffff7e84000 20
输出效果:
0xf3 0x0f 0x1e 0xfa 0x41 0x57 0x41 0x56 0x41 0x55 0x41 0x54 0x41 0x89 0xfc 0x55 0x00 0xa8 0xec 0x81
也可以将自定义命令的代码写入~/.gdbinit实现永久生效。
内容的提问来源于stack exchange,提问作者daisy
相关产品推荐
相关产品推荐

