GDB: точка останова во встроенном модуле Linux не работает - PullRequest
0 голосов
/ 31 мая 2018

Я отлаживаю ядро ​​Linux, используя две виртуальные машины, подключенные через последовательный порт.

Целевая машина ожидает подключения от удаленного GDB, вставив kgdbwait() и kgdboc=ttyS0,115200 в правильную записьв /boot/grub/grub.cfg.

В Хост-машина

sudo gdb ./vmlinux

Символы прочитаны, и я должен иметь возможность устанавливать точки останова на именах функций.

(gdb) break oom_kill_process
Breakpoint 1 at 0xc1172ef0: file mm/oom_kill.c, line 843.

Работает нормально!

Однако, если я установлю точку останова на htb_dequeue_tree, которая найдена здесь , я получу следующую ошибку:

(gdb) break htb_dequeue_tree

Нетсимвол "htb_dequeue_tree" в текущем контексте.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Проблема заключалась в том, что HTB - это встроенный модуль, который вставляется динамически, поэтому при создании он не включается в файл vmlinux, содержащий символы.

Чтобы это исправить, его нужно заменить на внутреннюю часть, а не на модуль, и это можно сделать в menuconfig

Просто запустите

make menuconfig

Найдите модуль и изменитеот <m> до <*>

Пересмотрите ваше ядро, установите модули и установите, это должно привести к новому vmlinux, который будет содержать символы нужного модуля, чтобы вы могли установить точку останова налюбая строка \ имя функции.

0 голосов
/ 31 мая 2018

Наиболее типичной причиной является функция, которая становится встроенной - тогда для начала нет символа.Довольно часто вы можете поставить разрыв на пару файл + строка (например, foo.c: 42).

В вашем конкретном случае функция является статической и имеет только одного пользователя: htp_dequeue.Если вы разберете его, вы, вероятно, увидите код из htp_dequeue_tree. Если нет, то происходит какой-то другой сбой (работает ли взлом других функций?)

...