Exynos4412 内核移植(七)—— 内核相关知识补充
一、內核調試方法簡單分析
1、addr2line: 解決oops錯誤
? ???a -- oops消息
? ? ? oops(也稱 panic),稱程序運行崩潰,程序崩潰后會產生oops消息。應用程序或內核線程的崩潰都會產生oops消息,通常發生oops時,系統不會發生死機,而在終端或日志中打印oops信息。
? ? ?當使用NULL指針或不正確的指針值時,通常會引發一個 oops 消息,這是因為當引用一個非法指針時,頁面映射機制無法將虛擬地址映像到物理地址,處理器就會向操作系統發出一個"頁面失效"的信號。內核無法"換頁"到并不存在的地址上,系統就會產生一個"oops"。
? ? ?oops 顯示發生錯誤時處理器的狀態,包括 CPU 寄存器的內容、頁描述符表的位置,以及其一些難理解的信息。這些消息由失效處理函數(arch/*/kernel/traps.c)中的printk 語句產生。較為重要的信息就是指令指針(EIP),即出錯指令的地址。
? ??
? ? ?b -- 解決方法
? ? ? ? ??arm-linux-addr2line ?地址 ?-e ?vmlinux ?-f ?
? ? ? ? ? 將Pc地址轉換成對應的行號
2、通過printk打印信息
? ? ?內核通過 printk() 輸出的信息具有日志級別,日志級別是通過在 printk() 輸出的字符串前加一個帶尖括號的整數來控制的,如 printk("<6>Hello, world!/n");。內核中共提供了八種不同的日志級別,在 linux/kernel.h 中有相應的宏對應。
#define KERN_EMERG ? ?"<0>" ? ?/* system is unusable */
#define KERN_ALERT ? ?"<1>" ? ?/* action must be taken immediately */
#define KERN_CRIT ? ? "<2>" ? ?/* critical conditions */
#define KERN_ERR ? ? ?"<3>" ? ?/* error conditions */
#define KERN_WARNING ?"<4>" ? ?/* warning conditions */
#define KERN_NOTICE ? "<5>" ? ?/* normal but significant */
#define KERN_INFO ? ? "<6>" ? ?/* informational */
#define KERN_DEBUG ? ?"<7>" ? ?/* debug-level messages */
? ? ? 所以 printk() 可以這樣用:
? ? ??printk(KERN_INFO "Hello, world!/n");。
? ?
? ? ? 未指定日志級別的 printk() 采用的默認級別是 DEFAULT_MESSAGE_LOGLEVEL,這個宏在 kernel/printk.c 中被定義為整數 4,即對應KERN_WARNING。
? ? ?在 /proc/sys/kernel/printk 會顯示4個數值(可由 echo 修改),?分別表示當前控制臺日志級別、未明確指定日志級別的默認消息日志級別、最小(最高)允許設置的控制臺日志級別、引導時默認的日志級別。
? ? ?當 printk() 中的消息日志級別小于當前控制臺日志級別時,printk 的信息(要有/n符)就會在控制臺上顯示。但無論當前控制臺日志級別是何值,通過 /proc/kmsg (或使用dmesg)總能查看。另外如果配置好并運行了 syslogd 或 klogd,沒有在控制臺上顯示的 printk 的信息也會追加到 /var/log/messages.log 中。
char myname[] = "chinacodec/n";
printk(KERN_INFO "Hello, world %s!/n", myname);
總結
以上是生活随笔為你收集整理的Exynos4412 内核移植(七)—— 内核相关知识补充的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jps、jinfo、jstat、jsta
- 下一篇: RS485通讯的工作原理?