あなたの問題は、変数をgdbに出力する方法に関係していると思います。この単純なプログラムを取得し、デバッグとしてコンパイルし ( -g
gcc を使用している場合)、実行して最初のputs
ステートメントでブレークします。
int main(void)
{
char *ptr = "str \xff";
char arr[] = "str \xff";
puts(ptr);
puts(arr);
return 0;
}
ptr
あなたが言及した方法で印刷しようとすると、 (それが指しているアドレス)のp /x ptr
値が印刷されます:ptr
(gdb) p /x ptr
$1 = 0x4005f8
ただし、 に対して同じコマンドを実行するとarr
、次のようになります。
(gdb) p /x arr
$2 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}
これは、 gdb がそれarr
がタイプchar[6]
であり、 ではないことを確認できるためchar*
です。コマンドを使用して同じ結果を得ることができますp /x "str \xff"
。これは、テストに役立ちます。
(gdb) p /x "str \xff"
$3 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}
ポインターが指すアドレスから一定量のバイトを出力できるようにしたい場合は、print ( )x
の代わりに inspect ( ) メモリ コマンドを使用します。p
(gdb) x/6bx ptr
0x4005f8 <__dso_handle+8>: 0x73 0x74 0x72 0x20 0xff 0x00
が指すアドレスから 6 バイトを 16 進数で出力しますptr
。変数でそれを試して、buff
どうなるか見てみましょう。
別の方法として、次のことを試すことができます。
(gdb) p /x (char[6])*ptr
$4 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}
char
これにより、指されたptr
が 6 の配列の最初の要素として扱われchar
、print コマンドを使用できるようになります。