GNU/Linux >> Linux Esercitazione >  >> Linux

Perché pr_debug del kernel Linux non fornisce alcun output?

CONFIG_DYNAMIC_DEBUG=y

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

Se compili il kernel con questa opzione, puoi fare cose incredibili come:

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

e questo abiliterà selettivamente il pr_debug() vuoi.

Possiamo quindi testarlo con:

insmod mymodule.ko

che stampa molte informazioni di debug extra come in:

[   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 

E in particolare contiene l'indirizzo di caricamento del modulo:

[   84.877482]  0xffffffffc0005000 .text            

che è utile per convertire gli indirizzi in linee.

Per i moduli, possiamo fare:

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

che ci permette di testare facilmente pr_debug aggiungendolo al nostro modulo.

Testato su kernel 4.16 con questa configurazione.

printk(KERN_DEBUG !=pr_debug quando CONFIG_DYNAMIC_DEBUG=y

Questo è molto incoerente, ma printk(KERN_DEBUG viene visualizzato quando loglevel=8 anche se non abilitiamo /sys/kernel/debug/dynamic_debug/control , questo può essere visto da:https://stackoverflow.com/a/37283021/895245


Aggiungi quanto segue a Makefile, supponendo filename.c è il file sorgente del modulo.

CFLAGS_filename.o := -DDEBUG

non

CFLAGS_[filename].o := -DDEBUG

Fare riferimento a https://www.kernel.org/doc/local/pr_debug.txt


Linux
  1. Linux:perché non è presente alcun file system Rootfs sul sistema?

  2. Perché Grep -o -w non mi dà l'output previsto su Mac Os X?

  3. Linux:perché il kernel non può eseguire Init?

  4. Linux – Le cuffie non funzionano Linux Mint 18?

  5. Omissione della prima riga da qualsiasi output di comando Linux

Analizza il kernel Linux con ftrace

Come il kernel Linux gestisce gli interrupt

Come controllare la versione del kernel in Linux

Linux:perché Apt Autoremove non rimuove tutti i vecchi pacchetti del kernel in una volta?

Linux – Partecipare alla mailing list del kernel?

Docker:impossibile aggiungere le interfacce di coppia (operazione non supportata)