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