Расположение загружаемого модуля ядра в памяти устанавливается только после вставки модуля.Когда вы устанавливаете точку останова для функции модуля, GDB обращается к файлу модуля (.ko) для адреса, что неверно.Вам необходимо сообщить GDB о фактическом местонахождении модуля.
Вы можете обратиться к этой книге (глава 4, раздел «Отладчики и связанные с ними инструменты») для получения дополнительной информации, но вот небольшая процедура, которую я разработал для этого.
- На компьютере 1 запустите
modpbrobe your_module_name
- На машине 1 выполните следующие команды оболочки:
MODULE_NAME=your_module_name
MODULE_FILE=$(modinfo $MODULE_NAME| awk '/filename/{print $2}')
DIR="/sys/module/${MODULE_NAME}/sections/"
echo add-symbol-file $MODULE_FILE $(cat "$DIR/.text") -s .bss $(cat "$DIR/.bss") -s .data $(cat "$DIR/.data")
вы должны получить вывод, подобный следующему: add-symbol-file /lib/modules/.../your_module_name.ko 0xffffffffa0110000 -s .bss 0xffffffffa011b948 -s .data 0xffffffffa011b6a0
- На машине 2 запустите
gdb vmlinux
. - На machine2 в консоли gdb запустите вывод последней команды на этапе 2.
- На machine2 в консоли gdb подключитесь к machine1, запустив
target remote /dev/ttyS0
(при условии, что ваш последовательный порт находится в ttyS0) - На машине1 запустите
echo g > /proc/sysrq-trigger
.Аппарат зависнет - На machine2 в консоли gdb установите желаемую точку останова.
- Продолжите отладку.Точка останова должна срабатывать, когда это необходимо.
Могут быть и другие проблемы, мешающие вам установить точку останова, но это является основным препятствием для перехода.