我试图检查一个缓冲区,它包含二进制格式的消息,但也包含字符串数据。作为一个例子,我使用这个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接口,并得出了以下结论:
我知道这可能不是最漂亮和优雅的解决方案,但它完成了工作,并作为第一稿工作。它可以包含在
~/.gdbinit
中,比如:然后可以与上面的程序一起使用,如下所示:
还有其他一些很好的方法:
没有承诺没有错误:)。如果人们感兴趣的话,我可能会把它贴在github上。
我只用GDB7.4测试过。
似乎很容易;-)
您可能会编写一个Python脚本(现代GDB版本已经嵌入了Python解释器)来执行同样的操作,并消除“shell out”的需要。
一种改进的用户FatalError解决方案
实例
高清0xbffe4f1
高清0xbffe4f1 500
相关问题 更多 >
编程相关推荐