16.6. Отладка загружаемых модулей с помощью GDB

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

Первым делом вам нужно построить модуль (или модули) с включением отладочной информации:

    # cd /sys/modules/linux
    # make clean; make COPTS=-g

Если вы используете GDB в режиме удаленного доступа, то для определения того, куда был загружен модуль, можете запустить команду kldstat на целевой машине:

    # kldstat
    Id Refs Address    Size     Name
     1    4 0xc0100000 1c1678   kernel
     2    1 0xc0a9e000 6000     linprocfs.ko
     3    1 0xc0ad7000 2000     warp_saver.ko
     4    1 0xc0adc000 11000    linux.ko

Если вы отлаживаете аварийный дамп, вам потребуется просмотреть список linker_files начиная с linker_files->tqh_first и следовать указателям link.tqe_next до тех пор, пока не найдете запись с тем filename, который вы ищете. Элемент address этой записи является адресом загрузки модуля.

Затем вам нужно определить смещение текстового сегмента модуля:

    # objdump --section-headers /sys/modules/linux/linux.ko | grep text
      3 .rel.text     000016e0  000038e0  000038e0  000038e0  2**2
     10 .text         00007f34  000062d0  000062d0  000062d0  2**2

То, что вы ищете, является секцией .text, в примере выше это секция 10. Четвертое числовое поле (всего шестое по счёту) является смещением текстовой секции внутри файла. Добавьте это смещение к адресу загрузки, чтобы получить адрес, на который был перемещён код модуля. В нашем примере мы получим 0xc0adc000 + 0x62d0 = c0ae22d0. Воспользуйтесь командой add-symbol-file в GDB для указания отладчику на модуль:

    (kgdb) add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0
    add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
    (y or n) y
    Reading symbols from /sys/modules/linux/linux.ko...done.
    (kgdb)

Теперь вы должны получить доступ ко всем символам в модуле.