Я пытаюсь проверить буфер, который содержит двоичное форматированное сообщение, но также содержит строковые данные. В качестве примера я использую этот код 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. Кроме того, вы потеряете адреса из исходной памяти таким образом.
Я использую GDB 7.4 с встроенной поддержкой python, поэтому я открыт идее использования красивого принтера или подобного, но я не знаю, как это установить.