質問

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 によって異なる処理が行われる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top