Как отладить проблемы в модуле ядра Linux `init ()`? - PullRequest
3 голосов
/ 09 апреля 2010

Я использую удаленный (k) GDB для отладки проблемы в модуле, который вызывает панику при загрузке, например, когда init() вызывается.

Трассировка стека просто показывает, что do_one_initcall(mod->init) вызывает сбой. Чтобы загрузить файл символов в GDB, мне нужно получить адрес текстового раздела модуля и получить его, чтобы загрузить модуль.

Поскольку insmod в busybox (1.16.1) не поддерживает -m, поэтому я застрял на grep modulename /proc/modules +, добавляя смещение от nm для определения адреса.

Так что здесь я сталкиваюсь с проблемой курицы и яйца - чтобы отладить загрузку модуля, мне нужно загрузить модуль - но чтобы загрузить модуль, мне нужно отладить проблема ...

Итак, я сейчас думаю о двух вариантах - есть ли способ получить информацию об адресе:

  1. от printk () в коде инициализации модуля
  2. с помощью printk () где-то в коде ядра

все это до вызова mod->init() - чтобы я мог разместить там точку останова, загрузить файл символов, нажать c и увидеть, как он падает и горит ...

1 Ответ

5 голосов
/ 09 апреля 2010

Можете ли вы встроить свой код в ядро, а не в модуль? Это может упростить отладку вызова init().

Вы также можете установить точку останова на do_one_initcall() и посмотреть адрес mod->init, чтобы получить адрес загрузки.

...