При отладке аварийного останова системы, которое произошло в модуле, или при использовании 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)
Теперь вы должны получить доступ ко всем символам в модуле.