Contents
Vorige week kwamen sommige lezers een nieuwe foutcode tegen met printk-foutopsporingsverhogingen. Dit probleem treedt op vanwege een aantal factoren. Laten we er nu een paar bekijken.De belangrijkste zwakte is dat printk behoorlijk vast is, dus we moeten van tevoren bedenken wat klanten willen tracken, en als je iets specifieks wilt tracken, moet je terugkeren om je wachtwoord opnieuw te compileren, wat behoorlijk omslachtig kan zijn.
Misschien is de gemakkelijkste strategie om foutopsporingsinformatie uit de kernelcode van een persoon te genereren, het afdrukken van een behoorlijk aantal informatie naar printf, waarbij het kernelequivalent, de printk-functie en het is echt zo derivaten.De k in printk kan eindigen zoals specifiek gebruikt om kernelwebontwikkelaars eraan te herinneren dat de omgeving anders is.
Gebruik
PC-problemen? Los ze binnen enkele minuten op.
Heeft u een computerprobleem? Je bent niet alleen. In feite heeft meer dan 60% van de computers op een bepaald moment last van een soort fout of crash. Reimage is de beste oplossing om deze problemen op te lossen en uw pc weer op snelheid te krijgen. Klik hier om te beginnen:

printk werkt op vrijwel dezelfde manier als in gebruikersruimte printf, dus als je nu fouten hebt gemaakt in je hoofdgebruikersruimteprogramma dat printf heeft, ben je klaar en in staat om hetzelfde te implementeren met , bijvoorbeeld kernelcode. door een debugger toe te voegen:
printk("Mijn Printkn");
printk("Var1 %d var2 %dn", var1, var2);
$dmesg
Is printk gebufferd?
Alle printk()-signalen worden naar hun kernel-logbuffer geschreven, die een betrouwbare circulaire buffer is geworden die via /dev/kmsg naar de opslagruimte van de gebruiker wordt geëxporteerd. De gebruikelijke manier om het te lezen is om met dmesg te werken. Als de prioriteit van de gedachte letterlijk hoger is (lagere log-somwaarde) dan de console_loglevel-waarde, wordt het eigenlijke bericht naar de betreffende console gestuurd.
Het commando is aanwezig in één met betrekking tot je shells – het zal het volledige menselijke kernellogboek kopiërenbuffer op je.
De meeste printf()-routines die zijn opgericht door de De conversies die worden ondersteund door onze eigen bibliotheek met gebruikersruimtetypes, bevinden zich tegenwoordig gelijktijdig in de kernel; Er zijn vaak een paar opvallende toevoegingen, samen met “%pf” die een symboolbedrijf kan retourneren in plaats van een numerieke aanwijzer. Let op als die er is. U bent over het algemeen welkom
Opmerking. Gebruik altijd %zu, %zd of to %zx wanneer u met afdrukken werkt.size_t en verder ssize_t waarden. ssize_t in combinatie vergezeld van size_t zijn vrij algemeen denken in deze kernel, dusGebruik %z om vervelende waarschuwingen te vermijden.
Nuttige tips van de auteur zelf:
Als u elk van de oeps (bijv. veroorzaakt door hulp) in uw stuurprogramma wilt debuggen en uw operatie weet niet waar oeps gewoonlijk opduiken, voeg dan gewoon deze regel toe
printk(KERN_ALERT "DEBUG: %s %d n verstreken",__FUNCTION__,__LINE__);
na elke mogelijk demoraliserende uitspraak.Hercompileer (her)laad en de module zal zeker ook een fout geven – je primaire familielogboek zal nu gebruikers de vorige regel laten zien die liep om ze te vangen voordat de oeps gebeurde.
Natuurlijk moet iedereen die “onbeleefde” adsValues verwijderen voordat je je module plaatst. 😉
Verbind je niveau
Hoe plaats ik het foutopsporingsniveau in Linux?
Gebruik het commando cats /proc/cmdline om het kernel-vraagpaneel weer te geven dat voor de vorige kick-out is gebruikt. Dat is alles, het getal dat voor de parameter loglevel wordt gegeven, moet soms groter zijn dan KERN_DEBUG. Het komt er simpelweg op neer dat je aan de slag moet met loglevel=8. Of gebruik gewoon onze conventie negeer_loglevel-instelling om alle grootste nieuwscampagnes weer te geven.
Als je direct naar de daadwerkelijke kernelcode kijkt, zul je zeker regelmatig iets zien als:
printk(KERN_ERR "er is iets fout gesprongen, retourcode: %dn",ret);
Hoe kan ik mijn dmesg-recordniveau verhogen?
Dit niveau wordt gebruikt om veiligheidsmaatregelen of berichten over dreigende storingen te geven. Logboekniveau 5 – KERN_NOTICE. Berichten die dit ernstniveau gebruiken, zijn bijeenkomsten die het vermelden waard zijn. Logboekniveau 6 is waarschijnlijk eigenlijk KERN_INFO: dit is het bestandsniveau dat wordt gebruikt voor informatieve berichten, echt een actie die door deze kernel wordt uitgevoerd.
waarbij “KERN_ERR” een van de acht verschillende logniveaus is.include/linux/kern_levels.h en definieert de diepte van alle foutmeldingen.
Merk op dat rechts in feite GEEN komma is tussen KERN_ERR en de format string (omdat de belangrijkste preprocessor de paar strings samenvoegt).
Het niveauloggebied begint met KERN_SOH, wat “Header Start” aangeeft voor elke kernel, het feit dat het zo iseen enkel ASCII 1-teken, in wezen “ 01” gespecificeerd in de code (d.w.z. alles tot en met octaal). Dit teken wordt gebruiktom protocoldynamiek, niveau, te integreren, wat de specifieke ASCII-promotiecode is die getallen met protocolniveaus vertegenwoordigt, plus “c”.voor het grote geval van hun karaktervoortzetting. Lees de download voor meer details.
De pr_*-macro’s (behalve pr_debug) zijn eenvoudige steno-definities.in include/linux/printk. je eigen Xvoor een specifieke oproep om u te helpen printk, maar het moet waarschijnlijk worden gebruikt in moderne stuurprogramma’s. pr_devel .en .pr_debug .worden vervangen door .suffer op .printk(KERN_DEBUG …. als de kernelvolledig in elkaar gezet met DEBUG, anders vervangen door een nuttige lege verklaring. Het gebruik van “pr_*” vogue printk-subroutines wordt aangemoedigd in plaats van alleen direct gebruik van printk.par met like log_level macro. Er is een speciale vorm van het printk-programma voor gereedschapsstuurprogramma’s, wrappers ervooraanvullende feiten en strategieën weergeven. Er zijn bijvoorbeeld dev_emerg, dev_crit, dev_alert, dev_err,dev_warn, dev_notice, dev_info, dev_dbg. Als je iets afdrukt dat te maken heeft met het apparaat, zou ik zeggen:deze routines zouden in feite moeten worden gebruikt van de corresponderende pr_* routines. Als ons team geen logboekniveau opgeeft in uw bericht, is dit het achterstallige niveauDEFAULT_MESSAGE_LOGLEVEL (meestal “4” = KERN_WARNING)die mogelijk kan worden geïnstalleerdUpdate via kernelconfiguratie CONFIG_DEFAULT_MESSAGE_LOGLEVELOptie (maak menuconfig->Kernelhack->Standaardbericht brandhoutniveau) Het logniveau wordt door de specifieke kernel gebruikt om zijn afwezigheid te detecterenbericht en besluit het opnieuw in te dienen, zou ik de gebruiker vertellenonmiddellijk door het te gebruiken om het af te drukken naar de huidige xbox (waar de console ook kan)eigen seriële lijn zijn of zelfs een enkele printer, geen xterm). Om dit te doen, vergelijkt de kernel de logcapaciteit van het interne bericht met:console_loglevel (kernelvariabele) en of de belangrijkste prioriteit veel hoger is (bijv.lagere waarde) in tegenstelling tot console_loglevel, zijn sommige berichten het resultaat van een fascinerende hulp in de oude console. Het eerste gehele getal vertelt je echt je goede huidige console_loglevel; laatstDe standaard loggrootte die u hierboven hebt beschreven. Om het heetste console_loglevel te wijzigen, schrijf je eigenlijk rechtstreeks naar dit bestand, dus okVoer een goede solide eenvoudige stap uit om alleen berichten op de console af te drukken Een andere manier om het type console-logniveau bij te werken is door gebruik te maken van dmesg met de -n optie.parameterAlias-functie
KERN_EMERG
KERN_SOH + “0”
Noodmeldingen, systemema is bijna mislukt of is instabiel
pr_emerg
CORE_ALERT
KERN_SOH + “1”
Er is iets ongewensts gebeurd en er moet dringend actie worden ondernomen.
alert_pr
KERN_CRIT
KERN_SOH + “2”
Er is een vrij belangrijke voorwaarde opgetreden, zoals een absoluut fatale hardware-/softwarefout.
pr_krit
KERN_ERR
KERN_SOH + “3”
Een fout die vaak door alle operators wordt gebruikt om problemen met de speciale hardware aan te geven.
pr_err
CORE_WARNING
KERN_SOH + “4”
Een waarschuwing, die op zich niets ernstigs betekent, maar wel tot problemen kan leiden
warning_pr
CORE_NOTE
KERN_SOH + “5”
Niets belangrijks, maar vooral toch. Een continu gebruikt rapport van belangrijke veiligheids- en beveiligingsgebeurtenissen.
pr_avis
CORE_INFO
KERN_SOH + “6”
Informatiebericht, zoals tips over financiële diensten tijdens de initialisatie van een nieuwe bestuurder
pr_info
CORE_DEBUG
KERN_SOH + “7”
Debug berichten
pr_debug, pr_devel als DEBUG normaal is ingesteld
KERN_DEFAULT
“”
Standaard bezoekniveau voor de kernel
KERN_CONT
KERN_SOH + “met”
‘continue’-gedeelte van de uitdrukking ‘brandhout’ (loopt alleen onmiddellijk na één regel die geen goede naloop heeft n) [1]
pr_cont
$ cat /proc/sys/kernel/printk7e Stap één bepaald 7huidige standaardwaarde standaard minimale importtijd
# mirror 8-10 > /proc/sys/kernel/printk
# #set console_loglevel om KERN_WARNING (4) of andere serieuzere berichten uit te voeren# dmesg -en 5
Printk Debug Levels
Niveis De Depuracao Printk
Printk 디버그 레벨
Niveles De Depuracion De Printk
Printk Felsokningsnivaer
Livelli Di Debug Di Printk
Printk Debug Ebenen
Niveaux De Debogage De Printk
Urovni Otladki Printk
Poziomy Debugowania Printk
