Смущает gdb print ptr vs print "% s"

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 ...

[edit: оказывается, что сбой был вызван глупым переполнением буфера на этой var ... grr ... не gdb, но вопрос печати был все еще действителен]

Кто-нибудь хочет отредактировать заголовок, чтобы он давал нам больше информации? У меня нет представителя, чтобы сделать это

Nathan Fellman 27.10.2008 11:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
7 523
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

Ответ принят как подходящий

Причина того, что 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"

из gdb, поэтому кажется, что, поскольку cwd был определен как char cwd[3500], gdb печатает весь массив, а если вы скажете gdb интерпретировать его как char*, он будет работать так, как вы ожидаете. Если ваше приложение вылетает, я предполагаю, что это из-за чего-то другого.

Другие вопросы по теме