內(nèi)核調(diào)試
(2012-08-26 15:10)
http://blog.csdn.net/flykite1988/article/details/6122433 1 printk [1] 使用范圍 除在系統(tǒng)啟動(dòng)過(guò)程中 , 終端未初始化之前 , 其他任何時(shí)候 , 任何地方都可以調(diào)用它 . [2] 記錄等級(jí) KERN_EMERG, KERN_ALERT, KERN_CRIT, KERN_ERR, KERN_WARNING, KERN_NOTICE, KERN_INFO, KERN_DEBUG. 若不指定記錄等級(jí) , 函數(shù)會(huì)?"淞? default_message_loglevel 指定的等級(jí) , 該變量被初始化為 DEFAULT_MESSAGE_LOGLEVEL( 目前為 KERN_WARNING). [3] 消息去向 按以下順序進(jìn)行 : Step1 如果 klogd 和 syslod 都在運(yùn)行 , 內(nèi)核信息被追加到 /var/log/messages( 或者其他地方 , 依據(jù) syslogd 的配置 ). 否則 Step2 依據(jù)變量 console_loglevel 的值來(lái)決定是否把內(nèi)核消息打印到當(dāng)前終端 (text-mode terminal, a serial port, or a parallel printer). 如果記錄等級(jí)小于 console_loglevel 整數(shù)變量的值 , 則內(nèi)核信息一次一行被發(fā)送到終端 . *** 無(wú)論在 Step1 和 Step2 中都可以通過(guò) dmesg 命令來(lái)查看 /proc/kmsg 中的內(nèi)核信息 . *** 只有在 console 下才有可在終端中打印出來(lái) (ctrl+alt+F1…F6), 在 Gnone 或 KDE 下不可以 . [4] 查看并修改重要變量的值
[5] 記錄緩沖區(qū) 內(nèi)核信息被保存在一個(gè) LOG_BUF_LEN 大小的環(huán)形隊(duì)列中 . 該緩沖區(qū)大小可以在編譯時(shí)通過(guò) CONFIG_LOG_BUF_SHIFT 進(jìn)行調(diào)整 . 在單處理器的系統(tǒng)上其默認(rèn)值為 16Kb. [6] Linux 系統(tǒng)日志 syslogd 這個(gè)守護(hù)進(jìn)程根據(jù) /etc/syslog.conf, 將不同的服務(wù)產(chǎn)生的 Log 記錄到不同的文件中 . LINUX 系統(tǒng)啟動(dòng)后,由 /etc/init.d/sysklogd 先后啟動(dòng) klogd,syslogd 兩個(gè)守護(hù)進(jìn)程。 其中 klogd 會(huì)通過(guò) syslog() 系統(tǒng)調(diào)用或者讀取 proc 文件系統(tǒng)來(lái)從系統(tǒng)緩沖區(qū) (ring buffer) 中得到由內(nèi)核 printk() 發(fā)出的信息 . 而 syslogd 是通過(guò) klogd 來(lái)讀取系統(tǒng)內(nèi)核信息 . 2> LINUX 系統(tǒng)中 /etc/init.d/sysklogd 會(huì)啟動(dòng) 2 個(gè)守護(hù)進(jìn)程 :Klogd, Syslogd 3> klogd 是負(fù)責(zé)讀取內(nèi)核信息的 , 有 2 種方式 : syslog() 系統(tǒng)調(diào)用 ( 這個(gè)函數(shù)用法比較全 , 大家去 MAN 一下看看 ) 直接的對(duì) /proc/kmsg 進(jìn)行讀取 ( 再這提一下 ,/proc/kmsg 是專門輸出內(nèi)核信息的地方 ) 2 OOPS Oops 中包含的重要信息對(duì)于所有體系結(jié)構(gòu)都是完全相同的 : 寄存器上下文和回溯線索 . 回溯線索顯示了導(dǎo)致錯(cuò)誤發(fā)生的函數(shù)調(diào)用鏈 . 寄存器上下文信息可能同樣有用 , 盡管使用起來(lái)不那么方便 . 如果你有函數(shù)的匯編代碼 , 這些寄存器數(shù)據(jù)可以幫助你重建引發(fā)問(wèn)題的現(xiàn)場(chǎng) . 在寄存器中一個(gè)本不應(yīng)該出現(xiàn)的數(shù)值可能會(huì)在黑暗中給你帶來(lái)第一絲光明 . [1] ksymoops 提供編譯內(nèi)核是產(chǎn)生的 System.map 和模塊信息 ( 如何你使用的是模塊 ) 把 OOPS 信息解碼 . $ ksymoops saved_oops.txt [2] kallsysms 開發(fā)版的 2.5 內(nèi)核引入了 kallsysms 特性 , 它可以通過(guò)定義 CONFIG_KALLSYMS 配置選項(xiàng)啟用 . 該選項(xiàng)可以載入內(nèi)核鏡像對(duì)應(yīng)的內(nèi)存地址的符號(hào)名稱 , 所以內(nèi)核可以打印解碼好的跟蹤線索 . 相應(yīng)地 , 解碼 oops 也不再需要 system.map 或者 ksysmoops 工具了 . 3 內(nèi)核調(diào)試配置選 這些選項(xiàng)都在內(nèi)核配置編輯器的內(nèi)核開發(fā) (Kernel Hacking) 菜單中 , 他們都依賴于 CONFIG_DEBUG_KERNEL. 當(dāng)你開發(fā)內(nèi)核的時(shí)候 , 作為一種練習(xí) , 不妨都打開這些選項(xiàng) . [1] 調(diào)試原子操作 把內(nèi)核配置成一旦在原子操作過(guò)程中進(jìn)程進(jìn)入休眠或者做了一些可能引起休眠的操作 , 就打印警告信息并提供追蹤線索 . CONFIG_PREEMPT = y CONFIG_DEBUG_KERNEL = y CONFIG_KALLSYMS = y CONFIG_SPINLOCK_SLEEP = y 4 引發(fā) bug 并打印信息 BUG() BUG_NO() 被調(diào)用時(shí)引發(fā) oops, 導(dǎo)致棧的回溯和錯(cuò)誤信息的打印 panic() 不但會(huì)打印錯(cuò)誤信息 , 而且會(huì)掛起整個(gè)系統(tǒng) dump_stack() 在終端上打印寄存器上下文和函數(shù)跟蹤線索 . 5 神奇的 SysRq 神奇系統(tǒng)請(qǐng)求鍵是另外一根救命稻草 , 該功能可以通過(guò)定義 CONFIG_MAGIC_SYSRQ 配置選項(xiàng)開啟用 . 當(dāng)該功能被啟用的時(shí)候 , 無(wú)論內(nèi)核處于什么狀態(tài) , 你都可以通過(guò)特殊的組合鍵跟內(nèi)核進(jìn)行通信 . 6 內(nèi)核調(diào)試器的傳奇 [1] gdb $ gdb vmlinux /proc/kcore > p global_variable > disassemble function [2] kgdb [3] kdb |
|