Смущает gdb print ptr против print "% s" - PullRequest
1 голос
/ 12 сентября 2008
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, но вопрос печати все еще действовал]

Ответы [ 4 ]

5 голосов
/ 12 сентября 2008

Я согласен с mweerden. Пробуя что-то похожее на ваш код, я получаю:

(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*, он будет работать так, как вы ожидаете. Если ваше приложение падает, я предполагаю, что это из-за чего-то другого.

2 голосов
/ 12 сентября 2008

Причина, по которой cwd печатается по-разному в gdb, заключается в том, что gdb знает, что ptr - это char * (я полагаю), а cwd - это массив длины 3500 (как показано в вашем выводе). Таким образом, при печати ptr он печатает значение указателя (и в качестве службы также строку, на которую указывает), а при печати cwd печатает массив целом .

Я не вижу причин, по которым использование cwd вместо ptr могло бы привести к проблемам, но для уверенности мне понадобится какой-то код.

1 голос
/ 12 сентября 2008

То, что ptr отображается в виде красиво отформатированной строки, а cwd в качестве "байтового буфера", вероятно, относится к gdb. В любом случае это не должно повлиять на ваше приложение; согласно man 3 getcwd, ptr должно указывать на cwd (или оно должно быть NULL, если произошла ошибка). Можете ли вы использовать ptr без сбоя программы?

0 голосов
/ 12 сентября 2008

Какой тип cwd? Приведенный выше фрагмент кода не говорит нам об этом. Может случиться так, что ptr как пустота * трактуется gdb по-разному.

...