1
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

Why is ptr printing the string correctly but cwd not; this also affects the program and it crashes if I try to use the cwd...

[edit: turns out that crash was caused by a stupid buffer overflow on this var... grr...not gdb, but the print question was still valid]

4

4 に答える 4

5

私はmweerdenに同意します。あなたのコードに似ていると私が信じていることを試してみると、次のようになります。

(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016���" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"

cwdとして定義されているためchar cwd[3500]、gdb は配列全体を出力しますが、gdb に として解釈するように指示すると、char*期待どおりに動作するようです。アプリケーションがクラッシュした場合、それは別の原因によるものだと思います。

于 2008-09-12T17:22:24.510 に答える
2

cwd異なる方法で印刷される理由は、それが(私が推測する) であり、それが長さの配列であることを知っているgdbためです(出力に示されているように)。したがって、印刷時にはポインター値 (およびサービスとしてそれが指す文字列) が印刷され、印刷時には配列全体が印刷されます。gdbptrchar *cwd3500ptrcwd

cwdの代わりに使用すると問題が発生する理由はわかりませんptrが、確認するにはコードを確認する必要があります。

于 2008-09-12T16:59:27.310 に答える
1

これptrは適切にフォーマットされた文字列として表示されcwd、「バイト バッファ」はおそらく gdb に固有のものです。いずれにせよ、アプリケーションに影響を与えるべきではありません。によるとman 3 getcwdptrを指すcwd必要があります (エラーが発生した場合は NULL にする必要があります)。ptrプログラムをクラッシュさせずに使用できますか?

于 2008-09-12T16:55:51.797 に答える
0

cwd とはどのような型ですか? 上記のコード スニペットでは、それがわかりません。void* である ptr が gdb によって異なる方法で処理されている可能性があります。

于 2008-09-12T16:58:28.343 に答える