Команда gdb `list` показывает только один номер строки вместо содержимого при присоединении к процессу - PullRequest
0 голосов
/ 20 июня 2020

Я вызвал gdb для присоединения текущего запущенного процесса с помощью этой команды sudo gdb binary PID. После этого я установил точки останова и набрал continue в gdb. Затем я отправил этому процессу запрос на попадание в точку останова. После этого, когда я набираю команду list, она показывает только одну строку вместо нескольких, как ожидалось, и показывает только номер строки вместо содержимого. Могу я спросить, что означает вывод команды n? В inte rnet некоторые документы упоминали, что это означает, что следующая строка будет выполнена. Но, судя по самому выводу, для меня это не имеет особого смысла (после двух команд n последняя команда l показывает 169 вместо 172 или 174). Может ли кто-нибудь помочь ответить на два вопроса выше? Очень признателен.

(gdb) l
164 in CBFEMultiSectionResponseModule.cc
(gdb) n
172 in CBFEMultiSectionResponseModule.cc
(gdb) l
167 in CBFEMultiSectionResponseModule.cc
(gdb) n
174 in CBFEMultiSectionResponseModule.cc
(gdb) l
169 in CBFEMultiSectionResponseModule.cc

Командная строка сборки для этого исходного файла выглядит так:

/usr/bin/g++ -c -fPIC -DMODULEADAPTER_BUILTIN_VERSION=\"2.36.375.10894.aff30c2\" -DLINUX -D_GNU_SOURCE -D_THREAD_SAFE -DUSE_STD_YUTSTRING  -I../api -I. -I/home/y/include/ydisc \
-I/home/y/include/avro -I../.. -I../../.. -I../../../external_interfaces -I../../../sg_interfaces -I/home/y/include64 -I/home/y/include     
\-fPIC -g -O2 -Wall -Werror -Wno-invalid-offsetof -fno-strict-aliasing -pipe -MD -MP   
\-DYAHOO_PLATFORM_MAJOR=6 -DYAHOO_PLATFORM_MINOR=10 CBFEMultiSectionResponseModule.cc -o x86_64-linux-gcc/CBFEMultiSectionResponseModule.o

Это тип файловой системы:

-bash-4.1$ df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/vda1      ext4   246G   97G  137G  42% /
tmpfs          tmpfs   12G   30M   12G   1% /dev/shm

Ниже это результат info source:

(gdb) info source
Current source file is CBFEMultiSectionResponseModule.cc
Compilation directory is /home/myusername/ufe/modules/multisectionresponse/impl
Source language is c++.
Compiled with DWARF 2 debugging format.
Does not include preprocessor macro info.

Ниже приведен результат shell cat:

(gdb) shell cat /home/myusername/ufe/modules/multisectionresponse/impl/CBFEMultiSectionResponseModule.cc
cat: /home/myusername/ufe/modules/multisectionresponse/impl/CBFEMultiSectionResponseModule.cc: No such file or directory

1 Ответ

1 голос
/ 20 июня 2020

когда я набираю список команд, он показывает только одну строку вместо нескольких, как ожидалось, и показывает только номер строки вместо содержимого

Это, скорее всего, происходит потому, что GDB имеет нет доступа к источнику. sudo является ключевым здесь. Ваш источник, вероятно, находится в файловой системе, которая не разрешает доступ root, такой как NFS.

для меня это не имеет особого смысла (после двух команд n последняя команда l показывает 169 вместо 172 или 174).

Вы отлаживаете оптимизированный код. См., Например, этот ответ .

Обновление:

Путь к исходному тексту правильный в среде компиляции. Однако среда выполнения отличается от среды компиляции ..

Ну, почему вы не сказали нам , что ?

Мой ответ правильный: GDB не перечисляет источник, потому что источник недоступен (он просто недоступен по другой причине, чем я предполагал).

Если вы хотите, чтобы команда GDB list работала в среде выполнения, вы должен сделать источник доступным (хотя и не обязательно в том же месте; используйте команду dir, чтобы указать GDB на место, где доступны источники).

Обновление 2:

. Раньше я думал, что GDB имеет несколько магических c способов получить исходный код из двоичного файла.

Двоичный файл не содержит исходных кодов (которые значительно увеличились бы). Вместо этого он содержит ссылки на исходные местоположения.

В частности, компилятор кодирует в двоичную форму для каждой единицы перевода (каждый .cpp файл):

  1. Каталог компиляции
  2. Имя исходного файла (ов) (их может быть более одного из-за #include s).
  3. Отображение счетчика программы на файл / строку, определенный фрагмент сборки был создан для.

(Есть дополнительная информация, описывающая расположение переменных, типы и т. д. c. Но это не имеет отношения к команде list.)

GDB выполняет декодирование, указанное выше, находит исходный файл (ы) и позволяет вам устанавливать точки останова по файлу / строке, перечисляет источник при достижении точки останова и т. Д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...