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