1. 程式人生 > >Linux 核心除錯之 printk

Linux 核心除錯之 printk

問題描述:最近這兩天再除錯 platform 驅動,程式老是有點小問題,得不到自己想要的結果,突然意識到核心除錯重要性,重新整理一下 printk 基本用法。核心通過 printk() 輸出相關資訊,在呼叫 printk() 函式時必須要指定日誌級別。

1、printk 日誌等級

在 include/linux/kernel.h 中定義瞭如下幾個日誌級別

<span style="font-family:Microsoft YaHei;font-size:12px;">#define	KERN_EMERG	"<0>"	/* 系統崩潰 */
#define	KERN_ALERT	"<1>"	/* 必須緊急處理 */
#define	KERN_CRIT	"<2>"	/* 臨界條件,嚴重的硬軟體錯誤 */
#define	KERN_ERR	        "<3>"     /* 報告錯誤 */
#define	KERN_WARNING	"<4>"	/* 警告 */
#define	KERN_NOTICE	"<5>"	/* 普通但還是須注意 */
#define	KERN_INFO	"<6>"	/* 資訊 */
#define	KERN_DEBUG	"<7>"	/* 除錯資訊 */</span>
這裡也可以看出數值越小,其緊急和嚴重程度就越高。

接下來,我們來看 kernel/printk.c 檔案:

/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
/* 因此,如果未在 printk() 中指定日誌級別,系統將預設採用4級 */
/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
DECLARE_WAIT_QUEUE_HEAD(log_wait);
int console_printk[4] = {
	DEFAULT_CONSOLE_LOGLEVEL,	/* console_loglevel */
	DEFAULT_MESSAGE_LOGLEVEL,	/* default_message_loglevel */
	MINIMUM_CONSOLE_LOGLEVEL,	/* minimum_console_loglevel */
	DEFAULT_CONSOLE_LOGLEVEL,	/* default_console_loglevel */
};
/* 這4組數字可以在/proc/sys/kernel/printk中更改 */

在 /proc/sys/kernel/printk 會顯示4個數值(可由 echo 修改),分別表示
當前控制檯日誌級別;
未明確指定日誌級別的預設訊息日誌級別;
最小(最高)允許設定的控制檯日誌級別;
引導時預設的日誌級別;
當 printk()中指定的級別 (數值上)小於 當前控制檯日誌級別(前面說過,數值越小,嚴重性越高)時,printk 的資訊(要有\n符)就會在控制檯上顯示。但無論當前控制檯日誌級別是何值,通過 dmesg 總能檢視。

系統的日誌記錄工具有兩種主要的:syslog 和 klog。
syslog 用於執行系統日誌記錄活動,系統程序顯示為 syslogd。配置檔案是/etc/syslog.conf。如果在配置檔案中把kern.*這一行前的#號去掉,那麼printk的資訊也會輸出到控制檯。其守護程序是syslogd。syslogd 程序從一組日誌源(如 /dev/log 和 /dev/klog )中讀取資料,並按照 /etc/syslog.conf 中的說明處理這些日誌訊息。


2、printk 輸出格式符

如果變數型別是 , 使用 prink 的格式說明符 : 
  int                                         %d 或者 %x( 注: %d 是十進位制, %x 是十六進位制 ) 
  unsigned int                          %u 或者 %x 
  long                                      %ld 或者 %lx 
  unsigned long                       %lu 或者 %lx 
  long long                              %lld 或者 %llx 
  unsigned long long               %llu 或者 %llx 
size_t                                    %zu 或者 %zx 
  ssize_t                                   %zd 或者 %zx 
 原始指標值必須用 %p 輸出。 
  u64,即(unsigned long log n),必須用 %llu 或者 %llx 輸出,如: 
  printk("%llu", (unsigned long long)u64_var); 
  s64,即(long long),必須用 %lld 或者 %llx 輸出,如 : 
  printk("%lld", (long long)s64_var); 

相關推薦

Linux 核心除錯 printk

問題描述:最近這兩天再除錯 platform 驅動,程式老是有點小問題,得不到自己想要的結果,突然意識到核心除錯重要性,重新整理一下 printk 基本用法。核心通過 printk() 輸出相關資訊

Linux核心分析三——使用gdb跟蹤除錯核心從start_kernel到init程序啟動

作者:姚開健 原創作品轉載請註明出處 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 Linux核心(本文以Linux-3.18.6為例)的啟動在原始碼init資料夾裡的main.c

Linux核心除錯printk()總結

我們在使用printk()函式中使用日誌級別為的是使程式設計人員在程式設計過程中自定義地進行資訊的輸出,更加容易地掌握系統當前的狀況。 對程式的除錯起到了很重要的作用。 (下文中的日誌級別和控制檯日誌控制級別是一個意思) printk(日誌級別 "訊息文字");這裡的日誌級

linux核心除錯技巧一:printk

printk是Linux核心的一個系統呼叫,也是核心程式碼除錯時最常用的技巧。 printk的格式化字串,參考:點選開啟連結 對於迴圈中的變數,或者被多次呼叫的函式裡面的變數, 有時候只需要列印一次,

嵌入式Linux開發——(十六)Linux核心除錯技術

1、核心列印函式printk     ①printk函式與printf函式用法格式完全相同     ②它所列印的字串頭部可以加入“<n>”樣式字元,n=0---7表示這條資訊的記錄  級別     ③對於p

linux核心除錯技巧之一 dump_stack【轉】

在核心中程式碼呼叫過程難以跟蹤,上下文關係複雜,確實讓人頭痛 呼叫dump_stack()就會列印當前cpu的堆疊的呼叫函數了。 如此,一目瞭然的就能看到當前上下文環境,呼叫關係了 假設: 遇到uvc_probe_video這麼一個函式,不知道它最終是被誰呼叫到的,根據linux裝置模型,初步推測,p

Linux核心Power_Managementsuspend詳解

1.Linux核心的suspend狀態 Linux核心支援多種型別睡眠狀態,目前存在四種模式:suspend to idle(freeze)、power-on standby(standb)、suspend to ram(memory;STR)和suspend to dis

linux核心除錯環境搭建

版本linux4.17 ubuntu18.04先給系統至少80G記憶體1。編譯核心先配置檔案make mrpropermake menuconfig我這裡需要的依賴有 sudo apt install make cmake gcc g++ clang sudo apt-get install libnc

Linux核心除錯的方式以及工具集錦

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可, 轉載請註明出處, 謝謝合作 因本人技術水平和知識面有限, 內容如有紕漏或者需要修正的地方, 歡迎大家指正, 也歡迎大家提供一些其他好的除錯工具以供收錄, 鄙人在此謝

Linux核心驅動GPIO子系統(一)GPIO的使用

四 使用者態使用gpio監聽中斷       首先需要將該gpio配置為中斷 echo  "rising" > /sys/class/gpio/gpio12/edge 以下是虛擬碼 int gpio_id; struct pollfd fds[1]; gpio_fd = open("/s

linux核心除錯方法

核心開發比使用者空間開發更難的一個因素就是核心除錯艱難。核心錯誤往往會導致系統宕機,很難保留出錯時的現場。除錯核心的關鍵在於你的對核心的深刻理解。 一  除錯前的準備 在除錯一個bug之前,我們所要做的準備工作有: 有一個被確認的bug。 包含這個bug的核心

Linux核心除錯方法總結

核心開發比使用者空間開發更難的一個因素就是核心除錯艱難。核心錯誤往往會導致系統宕機,很難保留出錯時的現場。除錯核心的關鍵在於你的對核心的深刻理解。  一  除錯前的準備 在除錯一個bug之前,我們所要做的準備工作有:  有一個被確認的bug。 包含這

linux核心除錯技巧四:gdb除錯+vmlinux

vmlinux是個elf檔案,它的符號表中包含了所有核心符號。 注意linux中很多檔案是沒有後綴的,比如我見到的這個elf檔案的檔名是“vmlinux-3.10.62”,沒有後綴。 既然是elf檔案

linux 核心除錯技術

核心開發比使用者空間開發更難的一個因素就是核心除錯艱難。核心錯誤往往會導致系統宕機,很難保留出錯時的現場。除錯核心的關鍵在於你的對核心的深刻理解。 一  除錯前的準備 在除錯一個bug之前,我們所要做的準備工作有: 有一個被確認的bug。 包含這個bug的核心版本號,需要分析出這個b

Linux核心除錯環境搭建(基於ubuntu12.04)

by Netfairy - 2016-05-29 一、測試環境 物理機:ubuntu16.04 LTS target(被除錯機)環境:VirtualBox 5.0.20+ubuntu 12.04 LTS + linux kernel 3.0.4 host

Linux核心除錯

#define    KERN_EMERG    "<0>"   /* system is unusable */#define    KERN_ALERT    "<1>"    /* action must be taken immediately    */#define    

linux核心分析軟定時器筆記

定時器是一種軟體功能,即允許在將來的某個時刻,函式在給定的時間間隔用完時被呼叫。超時表示與定時器相關的時間間隔已經用完的那個時刻。 linux上考慮兩種型別的定時器,即動態定時和間隔定時器。第一種型別由核心使用,而間隔定時器由程序在使用者態建立。 動態定時器 動態定時的主要

Linux核心開發記憶體與I/O訪問(三)

staticint xxx_mmp(struct file *filp, struct vm_area_struct *vma) { if(remap_pfn_range(vma, vma->vm_start, vm->vm_pgoff, vma->vm_end - vma->

Linux核心除錯技術——jprobe使用與實現

前一篇博文介紹了kprobes的原理與kprobe的使用與實現方式,本文介紹kprobes中的第二種探測技術jprobe,它基於kprobe實現,不能在函式的任意位置插入探測點,只能在函式的入口處探測,一般用於監測函式的入參值。本文首先通過一個簡單的示例介紹jprobe的使

Linux核心除錯工具

一些Linux Kernel的分析除錯工作,主要包換qemu,kprobes和trace等,以作備忘。 Qemu原始碼級除錯Kernel 1. Qemu編譯與安裝 先安裝libsdl的開發庫 $ ./configure $ make # make install Qe