gdb print ptr と print "%s" で混乱する
-
09-06-2019 - |
質問
1167 ptr = (void*)getcwd(cwd, MAX_PATH_LENGTH-1);
(gdb) n
1168 if (!ptr) {
(gdb) print ptr
$1 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) print &cwd
$2 = (char (*)[3500]) 0xbff2d96c
(gdb) print strlen(cwd)
$3 = 36
(gdb) print "%s",cwd
$4 = "/media/MMC-SD/partition1/aaaaaaaaaaa", '\0' <repeats 912 times>, "��O�001\000\000\000\000��027\000\000\000�3����EL鷠3�000��027\000\000\000\000\000\000\000\027\000\000\000\000��/�027\000\000\000�3����N����\230���鷠3�000��027\000\000\000\000\000\000\000��000\000\000\000\001\000\000\000��M鷠3����\000\000\000\000.\231�027��w\005\b\001\000"...
(gdb) print "%s", ptr
$5 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) Quit
ptr は文字列を正しく出力するのに、cwd は正しく出力しないのはなぜですか。これはプログラムにも影響し、CWD を使用しようとするとクラッシュします。
[編集:クラッシュの原因はこの変数の愚かなバッファ オーバーフローであることが判明しました...grr...gdb ではありませんが、印刷された質問はまだ有効でした]
解決
その理由は、 cwd
では異なって印刷されます gdb
なぜなら gdb
それは知っています ptr
です char *
(たぶん)そしてそれ cwd
長さの配列です 3500
(出力に示されているように)。したがって、印刷するときに ptr
ポインタ値 (およびサービスとして、それが指す文字列も) を出力し、出力時に cwd
を印刷します 全体 配列。
使用する理由がわかりません cwd
の代わりに ptr
問題が発生する可能性がありますが、確認するにはコードを確認する必要があります。
他のヒント
私もムウィールデンさんの意見に同意します。あなたのコードに似ていると思われるものを試してみると、次の結果が得られます。
(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016���" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"
gdb からなので、それ以来のようです cwd
として定義されました char cwd[3500]
, 、gdb は配列全体を出力しますが、gdb に配列を解釈するように指示すると、 char*
, 、期待どおりに機能します。アプリケーションがクラッシュした場合、別の原因が原因であると考えられます。
それ ptr
適切にフォーマットされた文字列として表示され、 cwd
「バイトバッファ」はおそらく gdb に固有のものであるためです。いずれにせよ、アプリケーションには影響しないはずです。によると man 3 getcwd
, ptr
を指す必要があります cwd
(エラーが発生した場合は NULL にする必要があります)。使える ptr
プログラムをクラッシュさせずに?
cwdの種類は何ですか?上記のコード スニペットではそれがわかりません。ptr が void* であると、gdb によって異なる処理が行われる可能性があります。