バイナリ形式のメッセージを含むバッファを検査しようとしていますが、文字列データも含まれています。例として、私はこのCのコードを使用しています:gdbからxxdのようにフォーマットされたメモリダンプ
int main (void) {
char buf[100] = "\x01\x02\x03\x04String Data\xAA\xBB\xCC";
return 0;
}
私はそれが正確に一致だ場合、私は気にしないでください(xxd
に似た形式で、buf
に何の進ダンプを取得したいのですが、私が実際に探しているのは、印刷可能な文字が並んだ16進ダンプです)。細かいですが、それはそのように文字列を選ぶのは難しい...または私はそれが困難になり
(gdb) x /100bs buf
0x7fffffffdf00: "\001\002\003\004String Data\252\273\314"
0x7fffffffdf13: ""
0x7fffffffdf14: ""
0x7fffffffdf15: ""
0x7fffffffdf16: ""
0x7fffffffdf17: ""
...
を使用することができます
(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内部
バイナリの部分を読むには...私が扱っている実際のメッセージには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サポートを組み込んでいますので、かなりのプリンタなどを使う考えはありますが、設定方法はわかりません。
ああ、良い考え。そのようなショートカットをGDBに追加するのは簡単だったことに気づいていませんでした。あなたが言及したように、私はこれをPythonでコーディングしましたが、私はそのイディオムを使用することができると確信しています。 – FatalError
'$ arg0'が構造体へのポインタである場合、' $ arg1'はバイト数ではなくオブジェクトの数として扱われることに注意してください。それが問題になる場合は '$ arg0 + $ arg1'の代わりに'((void *)$ arg0)+ $ arg1'を使用してください。 –
新しいバージョンの 'xxd'は' -o'フラグをサポートしているので、表示されるアドレス値にオフセットが追加されます。 –