あなたの問題は、変数をgdbに出力する方法に関係していると思います。この単純なプログラムを取得し、デバッグとしてコンパイルし ( -ggcc を使用している場合)、実行して最初の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 コマンドを使用できるようになります。