GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué pr_debug del kernel de Linux no da ningún resultado?

CONFIG_DYNAMIC_DEBUG=y

https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html

Si compila el kernel con esta opción, puede hacer cosas asombrosas como:

echo 8 > /proc/sys/kernel/printk
echo 'file kernel/module.c +p' > /sys/kernel/debug/dynamic_debug/control

y esto habilitará selectivamente el pr_debug() quieres.

Entonces podemos probar esto con:

insmod mymodule.ko

que imprime mucha información de depuración adicional como en:

[   84.875592] init_module: umod=0000000073518b66, len=185416, uargs=000000009c6e375a                    
[   84.876099] Core section allocation order:       
[   84.876257]  .text                               
[   84.876332]  .note.gnu.build-id                  
[   84.876418]  .rodata.str1.1                      
[   84.876492]  .orc_unwind_ip                      
[   84.876568]  .orc_unwind                         
[   84.876636]  __mcount_loc                        
[   84.876705]  .data                               
[   84.876760]  .gnu.linkonce.this_module           
[   84.876856]  .bss                                
[   84.876919] Init section allocation order:       
[   84.877041]  .symtab                             
[   84.877121]  .strtab                             
[   84.877235] final section addresses:             
[   84.877352]  0xffffffffc0006000 .note.gnu.build-id                                                    
[   84.877482]  0xffffffffc0005000 .text            
[   84.877580]  0xffffffffc0006024 .rodata.str1.1   
[   84.877695]  0xffffffffc0006040 .orc_unwind_ip   
[   84.877805]  0xffffffffc0006050 .orc_unwind      
[   84.877905]  0xffffffffc0006068 __mcount_loc     
[   84.878012]  0xffffffffc0007000 .data            
[   84.878107]  0xffffffffc0007000 .gnu.linkonce.this_module                                             
[   84.878238]  0xffffffffc0007340 .bss             
[   84.878331]  0xffffffffc000a000 .symtab          
[   84.878430]  0xffffffffc000a348 .strtab          
[   84.878657] Absolute symbol: 0x00000000          
[   84.878951] Absolute symbol: 0x00000000          
[   84.879713] hello init 

Y en particular, contiene la dirección de carga del módulo:

[   84.877482]  0xffffffffc0005000 .text            

que es útil para convertir direcciones a líneas.

Para módulos, podemos hacer:

echo 8 > /proc/sys/kernel/printk
echo 'module myprintk +p' > /sys/kernel/debug/dynamic_debug/control
insmod /myprintk.ko

lo que nos permite probar fácilmente pr_debug agregando eso a nuestro propio módulo.

Probado en kernel 4.16 con esta configuración.

printk(KERN_DEBUG !=pr_debug cuando CONFIG_DYNAMIC_DEBUG=y

Esto es muy inconsistente, pero printk(KERN_DEBUG aparece cuando loglevel=8 incluso si no habilitamos /sys/kernel/debug/dynamic_debug/control , esto se puede ver desde:https://stackoverflow.com/a/37283021/895245


Agregue lo siguiente a Makefile, asumiendo filename.c es el archivo fuente del módulo.

CFLAGS_filename.o := -DDEBUG

no

CFLAGS_[filename].o := -DDEBUG

Consulte https://www.kernel.org/doc/local/pr_debug.txt


Linux
  1. El kernel de Linux:las 5 principales innovaciones

  2. El ciclo de vida de las pruebas del kernel de Linux

  3. Linux:¿por qué no hay un sistema de archivos Rootfs presente en el sistema?

  4. Linux:¿participa en la lista de correo del kernel?

  5. ¿Por qué Grep -o -w no me da la salida esperada en Mac Os X?

Analizar el kernel de Linux con ftrace

Cómo el kernel de Linux maneja las interrupciones

Cómo verificar la versión del kernel en Linux

¿Por qué la salida de algunos programas de Linux no va ni a STDOUT ni a STDERR?

¿Por qué proteger el kernel de Linux del usuario root?

Docker:no se pudo agregar el par de interfaces (operación no admitida)