отладка модуля через KGDB - PullRequest
5 голосов
/ 07 июня 2011

Я хочу отладить мой модуль ядра. Для этого я пытаюсь установить точку останова на do_one_initcall в kernel / module.c непосредственно перед вызовом моего init_module, но при этом отображается

Невозможно получить доступ к памяти по адресу 0x802010a0

Ниже приведен Makefile, который я использую:

obj-m := hello.o

KDIR=/lib/modules/$(shell uname -r)/build
PWD=$(shell pwd)

EXTRA_CFLAGS += -g

all:
        make -C $(KDIR) M=$(PWD) modules

clean:
        make -C $(KDIR) M=$(PWD) clean

Пожалуйста, предложите мне, в чем может быть проблема.

1 Ответ

9 голосов
/ 07 июля 2011

Расположение загружаемого модуля ядра в памяти устанавливается только после вставки модуля.Когда вы устанавливаете точку останова для функции модуля, GDB обращается к файлу модуля (.ko) для адреса, что неверно.Вам необходимо сообщить GDB о фактическом местонахождении модуля.

Вы можете обратиться к этой книге (глава 4, раздел «Отладчики и связанные с ними инструменты») для получения дополнительной информации, но вот небольшая процедура, которую я разработал для этого.

  • machine1 - это отлаженный компьютер.
  • machine2 - это компьютер, на котором выполняется отладчик.

  1. На компьютере 1 запустите modpbrobe your_module_name
  2. На машине 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
  3. На машине 2 запустите gdb vmlinux.
  4. На machine2 в консоли gdb запустите вывод последней команды на этапе 2.
  5. На machine2 в консоли gdb подключитесь к machine1, запустив target remote /dev/ttyS0 (при условии, что ваш последовательный порт находится в ttyS0)
  6. На машине1 запустите echo g > /proc/sysrq-trigger.Аппарат зависнет
  7. На machine2 в консоли gdb установите желаемую точку останова.
  8. Продолжите отладку.Точка останова должна срабатывать, когда это необходимо.
Могут быть и другие проблемы, мешающие вам установить точку останова, но это является основным препятствием для перехода.
...