когда я набираю список команд, он показывает только одну строку вместо нескольких, как ожидалось, и показывает только номер строки вместо содержимого
Это, скорее всего, происходит потому, что GDB имеет нет доступа к источнику. sudo
является ключевым здесь. Ваш источник, вероятно, находится в файловой системе, которая не разрешает доступ root, такой как NFS.
для меня это не имеет особого смысла (после двух команд n последняя команда l показывает 169 вместо 172 или 174).
Вы отлаживаете оптимизированный код. См., Например, этот ответ .
Обновление:
Путь к исходному тексту правильный в среде компиляции. Однако среда выполнения отличается от среды компиляции ..
Ну, почему вы не сказали нам , что ?
Мой ответ правильный: GDB не перечисляет источник, потому что источник недоступен (он просто недоступен по другой причине, чем я предполагал).
Если вы хотите, чтобы команда GDB list
работала в среде выполнения, вы должен сделать источник доступным (хотя и не обязательно в том же месте; используйте команду dir
, чтобы указать GDB на место, где доступны источники).
Обновление 2:
. Раньше я думал, что GDB имеет несколько магических c способов получить исходный код из двоичного файла.
Двоичный файл не содержит исходных кодов (которые значительно увеличились бы). Вместо этого он содержит ссылки на исходные местоположения.
В частности, компилятор кодирует в двоичную форму для каждой единицы перевода (каждый .cpp
файл):
- Каталог компиляции
- Имя исходного файла (ов) (их может быть более одного из-за
#include
s). - Отображение счетчика программы на файл / строку, определенный фрагмент сборки был создан для.
(Есть дополнительная информация, описывающая расположение переменных, типы и т. д. c. Но это не имеет отношения к команде list
.)
GDB выполняет декодирование, указанное выше, находит исходный файл (ы) и позволяет вам устанавливать точки останова по файлу / строке, перечисляет источник при достижении точки останова и т. Д. c.