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...不库,但打印的问题仍然有效]

有帮助吗?

解决方案

的原因 cwd 是印刷的不同在 gdb 是因为 gdb 知道, ptr 是一个 char * (我猜), cwd 是一系列长度 3500 (如图所示,在你的输出)。因此,当印刷 ptr 它打印指针的价值(以及作为一种服务也串它指向的)和在打印 cwd 它打印的 整个 阵列。

我看不出有任何理由为什么使用 cwd 而不是的 ptr 会导致问题,但我需要看到一些代码是肯定的。

其他提示

我同意mweerden.想些事情我认为是类似于你的代码,我获得:

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

从库,因此它似乎是由于 cwd 被定义为 char cwd[3500],库打印的整个阵列,同时如果你告诉库,以将它解释为一个 char*, 它将作为你的期望。如果你的应用程序的崩溃,我要假设它是因为别的东西。

ptr 显示很好格式和串 cwd 作为"字节的缓冲区"可能是特定的库.在任何情况下,它应该不会影响你的应用程序;根据 man 3 getcwd, ptr 应点到 cwd (或应当NULL如果发生错误).你可以使用 ptr 没有崩溃的程序?

什么类型是cwd?上述代码没有告诉我们。这可能是ptr是一个void*处理不同的方式通过库.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top