GDB中info locals输出的char缓冲区内容解读及读取方法咨询
GDB char类型缓冲区输出解读方法
GDB打印char类型缓冲区时默认采用C语言字符串转义规则,所有内容均为单字节表示,不存在超出0~255范围的数值。你产生误解的核心原因是把输出中的三位数字转义序列当成了十进制/十六进制,实际这部分是八进制转义。
输出规则说明
- 可打印ASCII字符(取值范围0x20~0x7E)直接输出字符本身,比如输出中的
X、E、2、p、G等,每个字符对应1字节,直接查ASCII表即可得到对应十六进制值 - 不可打印字符如果有标准C短转义的会用短转义表示,比如
\0对应空字节(值为0) - 其余不可打印字符用
\加1~3位八进制数字表示,比如\310就是八进制数值310,转换为十进制是200,转换为十六进制是0xC8,完全在单字节范围内。你误认为数值大于256是因为把八进制数字按十进制计算了,比如输出中的\376按八进制转换为十进制是254,属于合法的单字节值
获取十六进制格式输出的方法
直接在GDB中执行内存查看命令即可得到你预期的、每字节对应两位十六进制的输出:
- 先执行
set print elements 0,避免长数组被自动截断 - 执行
x/Nxb buf命令,其中N替换为你要查看的缓冲区字节长度,参数含义:x:GDB内存查看命令N:要查看的内存单元数量x:以十六进制格式展示内容b:每个内存单元大小为1字节
内容的提问来源于stack exchange,提问作者user2370139
相关产品推荐
相关产品推荐

