【发布时间】:2012-02-10 18:47:58
【问题描述】:
我正在尝试检查一个缓冲区,该缓冲区包含二进制格式的消息,但也包含字符串数据。例如,我正在使用这个 C 代码:
int main (void) {
char buf[100] = "\x01\x02\x03\x04String Data\xAA\xBB\xCC";
return 0;
}
我想获得buf 中内容的十六进制转储,格式类似于xxd(我不在乎它是否完全匹配,我真正要找的是十六进制转储与可打印的字符并排)。
在 GDB 中我可以使用类似的东西:
(gdb) x /100bx buf
0x7fffffffdf00: 0x01 0x02 0x03 0x04 0x53 0x74 0x72 0x69
0x7fffffffdf08: 0x6e 0x67 0x20 0x44 0x61 0x74 0x61 0xaa
0x7fffffffdf10: 0xbb 0xcc 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdf18: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdf20: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdf28: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdf30: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdf38: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdf40: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdf48: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdf50: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffdf58: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
这很好,但很难用这种方式挑选字符串......或者我可以使用
(gdb) x /100bs buf
0x7fffffffdf00: "\001\002\003\004String Data\252\273\314"
0x7fffffffdf13: ""
0x7fffffffdf14: ""
0x7fffffffdf15: ""
0x7fffffffdf16: ""
0x7fffffffdf17: ""
...
这使得阅读二进制部分变得很困难......我正在处理的实际消息中也有很多 ascii nul,所以看起来真的是一团糟。
我能想到的最好办法就是这样做:
(gdb) dump binary memory dump.bin buf buf+100
然后
$ xxd dump.bin
0000000: 0102 0304 5374 7269 6e67 2044 6174 61aa ....String Data.
0000010: bbcc 0000 0000 0000 0000 0000 0000 0000 ................
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000060: 0000 0000 ....
但每次都这样做很痛苦。我发现有人以前想要这个,所以想知道是否有人找到了在 gdb 中实现它的方法。另外,您会以这种方式丢失原始内存中的地址。
我正在使用内置 python 支持的 GDB 7.4,所以我愿意使用漂亮的打印机或类似设备,但我不知道如何设置。
【问题讨论】:
标签: python debugging gdb pretty-print