2011-06-07 18 views
5

Quiero depurar mi módulo kernel. Para que yo estoy tratando de poner un punto de interrupción en do_one_initcall en kernel/module.c justo antes de mi init_module obtiene la llamada pero está mostrandodebugging de módulo a través de KGDB

No se puede acceder a la memoria en la dirección 0x802010a0

A continuación se muestra la Makefile que estoy usando:

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 

Por favor sugiérame cuál podría ser el problema.

Respuesta

9

La ubicación de un módulo de kernel cargable en la memoria se establece solo después de la inserción del módulo. Cuando establece un punto de interrupción en una función de módulo, gdb consulta el archivo de módulo (.ko) para la dirección, lo cual es incorrecto. Debe informar a gdb de la ubicación real del módulo.

Puede consultar this book (capítulo 4, sección Depuradores y herramientas relacionadas) para obtener más información, pero este es un breve procedimiento que ideé para hacerlo.

  • machine1 es la máquina depurada.
  • machine2 es la máquina que ejecuta el depurador.

  1. En machine1, ejecute modpbrobe your_module_name
  2. En machine1, ejecute los siguientes comandos shell:
    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")
    que debería obtener una salida similar a la siguiente:
    add-symbol-file /lib/modules/.../your_module_name.ko 0xffffffffa0110000 -s .bss 0xffffffffa011b948 -s .data 0xffffffffa011b6a0
  3. En machine2, ejecute gdb vmlinux.
  4. En machine2, en la consola GDB, ejecute la salida de la orden final en la etapa 2.
  5. En machine2, en la consola GDB, conectarse a MACHINE1 ejecutando target remote /dev/ttyS0 (suponiendo que el puerto serie está en ttyS0)
  6. En machine1, ejecute echo g > /proc/sysrq-trigger. La máquina se congelará
  7. En machine2, en la consola de gdb, configure el punto de interrupción como lo desee.
  8. Continuar la depuración. El punto de interrupción debería activarse cuando sea necesario.
Puede haber otros problemas que le impidan establecer el punto de interrupción, pero este es el principal obstáculo para cruzar.
+0

my 'insmod' tiene éxito y veo mi' module_init' kprints int he 'dmesg'. pero mi 'modprobe' falla. y así 'modinfo' falla también. podrías darnos alguna idea? –

+1

Puede haber varias razones. La más trivial es que modprobe no conoce su módulo, ya que consulta una base de datos, por lo que no puede hacer 'modprobe my_module_file.ko'. En su lugar, debe hacer 'modprobe my_module_name' después de insertarlo en la base de datos con' depmod -a'. Sin embargo, por el bien de este propósito, en realidad no importa. Usted sabe su nombre y nombre de archivo, por lo que simplemente puede usarlos en lugar de lo que sugiere la respuesta. p.ej. 'MODULE_NAME = my_module_name; MODULE_FILE = my_module_file.ko' – Nir

+0

Un consejo rápido: se requiere root para obtener el cat/sys/module/module-name-here/sections /.* cosas para trabajar ... (de lo contrario, solo muestra el valor 0x0). – kaiwan

Cuestiones relacionadas