修改自: 內核函數_Printk的輸出的格式控制

linux內核函數printk 可以指定輸出的優先級

KERN_EMERG"<0>"/*緊急事件消息,系統崩潰之前提示,表示系統不可用*/
KERN_ALERT"<1>"/*報告消息,表示必須立即採取措施*/
KERN_CRIT"<2>"/*臨界條件,通常涉及嚴重的硬件或軟件操作失敗*/
KERN_ERR"<3>"/*錯誤條件,驅動程序常用KERN_ERR來報告硬件的錯誤*/
KERN_WARNING"<4>"/*警告條件,對可能出現問題的情況進行警告*/
KERN_NOTICE"<5>"/*正常但又重要的條件,用於提醒。常用於與安全相關的消息*/
KERN_INFO"<6>"/*提示信息,如驅動程序啓動時,打印硬件信息*/
KERN_DEBUG"<7>"/*調試級別的消息*/

格式說明符:

變量類型 , 格式說明符

int %d 或者 %x( 注: %d 是十進制, %x 是十六進制 )
unsigned int <span style="white-space:pre">	</span>%u 或者 %x
long <span style="white-space:pre">		</span>%ld<span style="white-space:pre">	</span>或者 %lx
unsigned long <span style="white-space:pre">	</span>%lu<span style="white-space:pre">	</span>或者 %lx
long long <span style="white-space:pre">	</span>%lld <span style="white-space:pre">	</span>或者 %llx
unsigned long long %llu 或者 %llx
size_t <span style="white-space:pre">		</span>%zu <span style="white-space:pre">	</span>或者 %zx
ssize_t %zd <span style="white-space:pre">		</span>或者 %zx
<pre name="code" class="cpp" style="font-size: 17px;">// <span style="font-family: 宋體, 文泉驛微米黑, sans-serif, tahoma; font-size: 16.7999992370605px;">Notes:原始指針值必須用 %p 輸出。</span>

u64,即(unsigned long long),必須用 %llu 或者 %llx 輸出,如:

printk("%llu", (unsigned long long)u64_var);

s64,即(long long),必須用 %lld 或者 %llx 輸出,如 :

printk("%lld", (long long)s64_var);

如果 ( 變量類型 )<type> 的長度依賴一個配置選項 ( 例如: sector_t, blkcnt_t, phys_addr_t, resource_size_t) 或者 依賴相關的體系結構(例如: tcflag_t ),使用一個可能最大類型的格式說明符,並且顯示轉換它。如:

printk("test: sector number/total blocks: %llu/%llu\n",(unsigned long long)sector, (unsigned long long)blockcount);

實用實例

1、通過函數指針打印函數名

//kernel/workqueue.c
static void process_one_work(struct worker *worker, struct work_struct *work)
__releases(&gcwq->lock)
__acquires(&gcwq->lock)
{
    printk(KERN_ALERT "kaigo, process_one_work, start:%pS\n", (void *)work->func);
	struct cpu_workqueue_struct *cwq = get_work_cwq(work);
	struct global_cwq *gcwq = cwq->gcwq;
        ...

如此則能區分當前工作隊列的處理函數,對調試一些driver很有用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章