Contents
Förra veckan mötte vissa läsare en felkod med utskriftsfelsökningsnivåer. Detta problem uppstår på grund av ett antal faktorer. Nu ska vi börja diskutera några av dem.Den största nackdelen är att printk verkligen är statisk, så vi måste i förväg reda ut vad kunderna vill ha för att spåra, och om du vill spåra något specifikt måste du kompilera om ditt lösenord, vilket borde bli ganska besvärligt.
Det kanske bästa sättet att generera felsökningsinformation i din kärnkod är att producera olika information till printf med för närvarande kärnekvivalenten, printk-funktionen och dess derivator.K:et i printk kommer att kunna användas specifikt för att hjälpa kärnprogrammerare att miljön är annorlunda.
Använd
Problem med PC? Lös dem på några minuter.
Har du ett datorproblem? Du är inte ensam. Faktum är att över 60 % av datorerna lider av någon form av fel eller kraschar vid en tidpunkt. Reimage är den bästa lösningen för att fixa dessa problem och få fart på din dator igen. Klicka här för att komma igång:

printk fungerar ungefär på samma sätt som det gör med userspace printf, så om du faktiskt har felsökt ditt huvudanvändarutrymme medan du använder printf är du redo och kan hjälpa till att göra detsamma med, till exempel, kärnkod. genom att lägga till valfri felsökning:
printk("My Printkn");
printk("Var1 %d var2 %dn", var1, var2);
$dmesg
Är printk buffrad?
Alla printk()-meddelanden skrivs till min kärnloggbuffert, som har vuxit till att bli en cirkulär buffert som exporteras till kontoutrymme via /dev/kmsg. Den vanliga vägen att läsa den är att ta dmesg. Om det faktiska meddelandets prioritet är bokstavligen högre (lägre tränivåvärde) än fördelen console_loglevel, skickas meddelandet till deras konsol.
Kommandot finns i i av dina skal – det kan skriva ut hela den mänskliga kärnloggenbuffert som gäller dig.
De flesta av printf()-uppgifterna som skapas av Konverteringarna som stöds som ett resultat av biblioteket av användarutrymmestyp är å andra sidan tillgängliga i kärnan; Det finns vanligtvis några anmärkningsvärda tillägg, särskilt “%pf” som kan returnera ett logotypnamn istället för ett numeriskt förslag. Vänligen notera om det finns. Varsågod
Obs. Använd alltid %zu, %zd och %zx när du arbetar med utskrift.size_t och ssize_t värden. ssize_t i linje med size_t är ganska vanliga värden i den här kärnan, såInkludera %z för att undvika irriterande varningar.
Användbara tips som författaren:
Om du vill att det kan felsöka alla hopp (t.ex. orsakade av förbättrad hjälp) i din drivrutin och en persons företag inte vet var hoppsan vanligtvis förekommer, lägg bara till den här raden
printk(KERN_ALERT "DEBUG: %s %d n har förflutit",__FUNCTION__,__LINE__);
efter varje med största sannolikhet irriterande påstående.Omkompilera (om)ladda och komponenten kommer också att orsaka ett problem – din familjelogg kommer nu att visa dig den föregående raden som råkade köras framgångsrikt innan hoppsan hände.
Från programvaran bör du ta bort dessa “oförskämda” annonsvärden innan du aktiverar din modul. 😉
Anslut din nivå
Hur ställer jag in felsökningsnivån i Linux?
Använd kommandot pet cat /proc/cmdline för att visa en ny kärnkommandopanel som användes för föregående start. För att visaDet är allt, mängden specificerad för loglevel-parametern behöver bara vara större än KERN_DEBUG. Det betyder i huvudsak att du måste använda loglevel=8. Eller använd bara den anpassade ignore_loglevel-inställningen för att visa nästan alla större nyhetskampanjer.
Om du tittar en-mot-en på den faktiska kärnkoden, kommer alla regelbundet att se något som:
printk(KERN_ERR "något eliminerat fel, returkod: %dn",ret);
Hur följer jag öka min dmesg-rapportnivå?
Denna nivå används för att ha varningar eller meddelanden om överhängande problem. Loggnivå 5 – KERN_NOTICE. Meddelanden som använder denna svårighetsgrad kan vara händelser värda att nämna. Loggnivå halvdussin är faktiskt KERN_INFO: det är så loggnivån som används för informativa sms-meddelanden, nästan en åtgärd som utförs av deras kärna.
där “KERN_ERR” är en av flera olika loggningsnivåer.include/linux/kern_levels.h och definierar den särskilda svårighetsgraden av alla felmeddelanden.
Observera att det faktiskt INGET kommatecken finns mellan säg KERN_ERR och formatet gitarrsträng (eftersom huvudförprocessorn sammanfogar de fler strängarna).
Nivåloggområdet startar tillräckligt skäl för KERN_SOH som indikerar “Header Start” över kärnan, det faktum att tanken ärett enda ASCII 1-tecken, definierat som “ 01” i läget (dvs i oktalt). Denna karaktär används definitivtför att lägga till protokolldynamik, nivå, som har blivit en ASCII-kampanjkod som representerar numeriska tecken för protokollnivåer, plus “c”.för jag skulle säga det speciella fallet med deras karaktärsförlängning. Läs nedladdningen för lite mer information.
Makron pr_* (förutom pr_debug) är enkla stenografidefinitioner.i include/linux/printk. ditt Xför en specifik koppling till printk, men den borde utan tvekan användas i moderna drivrutiner.
pr_devel .och dessutom .pr_debug .ersätts med .suffer mellan .printk(KERN_DEBUG …. om kärnan varhelt sammansatt med DEBUG, annars ersatt med tanke på ett tomt uttalande.
Användning för att “pr_*” stil printk subrutiner uppmuntras i motsats till än direkt användning av printk.par som har dess log_level makro.
Det finns en underbar version av printk-programmet med drivrutiner, omslag för detvisa ännu mer information. Till exempel kan det finnas dev_emerg, dev_crit, dev_alert, dev_err,dev_warn, dev_notice, dev_info, dev_dbg. När du skriver ut något relaterat så att du enheten,dessa rutiner bör implementeras istället för motsvarande pr_* rutiner.
Om vi två inte anger en loggningsposition i ditt meddelande, är detta standardnivåDEFAULT_MESSAGE_LOGLEVEL (vanligtvis “4” = KERN_WARNING)som kan installeras Uppdatera via kärninställningar CONFIG_DEFAULT_MESSAGE_LOGLEVELAlternativ (gör menuconfig->Kernel Hack->Default Firewood Level Message)
Loggningsnivån används av den här specifika kärnan för att upptäcka dess frånvaromeddelande och bestämmer mig för att skicka in produkten igen, skulle jag berätta för en användareomedelbart genom att skriva ut det till frökonsolen (där konsolen i många fall också kanvara din egen seriella linje eller möjligen en skrivare, inte en xterm).
För att utföra detta jämför kärnan nedskrivningsnivån för det interna målet medconsole_loglevel (kärnvariabel) förutom rrf ökar prioriteten mycket (dvs.lägre värde) än console_loglevel, tenderar vissa meddelanden att skrivas ut för att hjälpa dig i en ny aktuell konsol.
$ cat /proc/sys/kernel/printk7e Stegspecifikt 7aktuellt standardvärde standard minimum hundra tid
Det första heltal anger verkligen din nuvarande console_loglevel; sistaDen förinställda släpnivån du beskrev ovan.
För att ändra alla nuvarande console_loglevel arbetar du faktiskt med den här filen, så okFölj ett enkelt steg för att göra alla meddelanden på konsolen
# reflection 8 > /proc/sys/kernel/printk
Ett annat sätt att modernisera konsolloggningsnivån är att använda dmesg med alternativet -n.parameter
# #set console_loglevel för att mata ut KERN_WARNING (4) eller andra mer allvarliga meddelanden# dmesg -n 5Skaffa det bästa PC-reparationsverktyget för din dator. Ladda ner nu.
Printk Debug Levels
Niveis De Depuracao Printk
Printk 디버그 레벨
Niveles De Depuracion De Printk
Livelli Di Debug Di Printk
Printk Debug Ebenen
Printk Foutopsporingsniveaus
Niveaux De Debogage De Printk
Urovni Otladki Printk
Poziomy Debugowania Printk
