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

为什么 ptr 正确打印字符串但 cwd 不正确;这也会影响程序,如果我尝试使用 cwd,它会崩溃......

[编辑:原来崩溃是由这个 var 上的愚蠢缓冲区溢出引起的……grr……不是 gdb,但打印问题仍然有效]

4

4 回答 4

5

我同意姆维尔登。尝试我认为与您的代码类似的东西,我得到:

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

来自 gdb,所以看起来既然cwd定义为char cwd[3500],gdb 会打印整个数组,而如果您告诉 gdb 将其解释为 a char*,它将按您的预期工作。如果您的应用程序崩溃,我会认为这是因为其他原因。

于 2008-09-12T17:22:24.510 回答
2

cwd以不同方式打印的原因gdb是因为gdb知道这ptr是一个char *(我猜)并且cwd是一个长度数组3500(如您的输出所示)。因此,在打印时ptr它会打印指针值(作为服务,它还指向它所指向的字符串),而在打印时cwd它会打印整个数组。

我看不出使用cwd代替ptr会导致问题的任何原因,但我需要查看一些代码才能确定。

于 2008-09-12T16:59:27.310 回答
1

ptr显示为格式良好的字符串,并且cwd“字节缓冲区”可能特定于 gdb。无论如何,它不应该影响您的应用程序;根据man 3 getcwd,ptr应该指向cwd(或者如果发生错误,它应该是 NULL )。你可以在ptr不崩溃程序的情况下使用吗?

于 2008-09-12T16:55:51.797 回答
0

cwd 是什么类型的?上面的代码片段并没有告诉我们这一点。可能 ptr 是一个 void* 被 gdb 以不同的方式对待。

于 2008-09-12T16:58:28.343 回答