小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

內(nèi)核調(diào)試

 WUCANADA 2012-10-23
內(nèi)核調(diào)試 (2012-08-26 15:10)
標簽style  分類: 嵌入式linux


http://blog.csdn.net/flykite1988/article/details/6122433

1 printk

[1] 使用范圍

除在系統(tǒng)啟動過程中 , 終端未初始化之前 , 其他任何時候 , 任何地方都可以調(diào)用它 .

[2] 記錄等級

    KERN_EMERG, KERN_ALERT, KERN_CRIT, KERN_ERR, KERN_WARNING, KERN_NOTICE, KERN_INFO, KERN_DEBUG.

    若不指定記錄等級 , 函數(shù)會?"淞? default_message_loglevel 指定的等級 , 該變量被初始化為 DEFAULT_MESSAGE_LOGLEVEL( 目前為 KERN_WARNING).

[3] 消息去向

    按以下順序進行 :

    Step1   如果 klogd syslod 都在運行 , 內(nèi)核信息被追加到 /var/log/messages( 或者其他地方 , 依據(jù) syslogd 的配置 ). 否則

    Step2  依據(jù)變量 console_loglevel 的值來決定是否把內(nèi)核消息打印到當前終端 (text-mode terminal, a serial port, or a parallel printer). 如果記錄等級小于 console_loglevel 整數(shù)變量的值 , 則內(nèi)核信息一次一行被發(fā)送到終端 .

   *** 無論在 Step1 Step2 中都可以通過 dmesg 命令來查看 /proc/kmsg 中的內(nèi)核信息 .

   *** 只有在 console 下才有可在終端中打印出來 (ctrl+alt+F1…F6), Gnone KDE 下不可以 .

[4] 查看并修改重要變量的值

變量

初始值

查看當前值

修改方法

console_loglevel

DEFAULT_CONSOLE_LOGLEVEL

$ cat /proc/sys/kernel/printk

First one

(1) sys_syslog 系統(tǒng)調(diào)用

(2) 啟動 klogd 時用 -c 選項來指定 console_loglevel 的值

(3) $ echo 8 > /proc/sys/kernel/printk

default_message_loglevel

DEFAULT_MESSAGE_LOGLEVEL

$ cat /proc/sys/kernel/printk

second one

(1) $ echo 8 > /proc/sys/kernel/printk

[5] 記錄緩沖區(qū)

內(nèi)核信息被保存在一個 LOG_BUF_LEN 大小的環(huán)形隊列中 . 該緩沖區(qū)大小可以在編譯時通過 CONFIG_LOG_BUF_SHIFT 進行調(diào)整 . 在單處理器的系統(tǒng)上其默認值為 16Kb.

[6]  Linux 系統(tǒng)日志

    syslogd 這個守護進程根據(jù) /etc/syslog.conf, 將不同的服務(wù)產(chǎn)生的 Log 記錄到不同的文件中 .

      LINUX 系統(tǒng)啟動后,由 /etc/init.d/sysklogd 先后啟動 klogd,syslogd 兩個守護進程。

      其中 klogd 會通過 syslog() 系統(tǒng)調(diào)用或者讀取 proc 文件系統(tǒng)來從系統(tǒng)緩沖區(qū) (ring buffer) 中得到由內(nèi)核 printk() 發(fā)出的信息 . syslogd 是通過 klogd 來讀取系統(tǒng)內(nèi)核信息 .
      1>
所有系統(tǒng)信息是輸出到 ring buffer 中去的 .dmesg 所顯示的內(nèi)容也是從 ring buffer 中讀取的 .

      2> LINUX 系統(tǒng)中 /etc/init.d/sysklogd 會啟動 2 個守護進程 :Klogd, Syslogd

      3> klogd 是負責讀取內(nèi)核信息的 , 2 種方式 : syslog() 系統(tǒng)調(diào)用 ( 這個函數(shù)用法比較全 , 大家去 MAN 一下看看 ) 直接的對 /proc/kmsg 進行讀取 ( 再這提一下 ,/proc/kmsg 是專門輸出內(nèi)核信息的地方 )
      4> Klogd
的輸出結(jié)果會傳送給 syslogd 進行處理 ,syslogd 會根據(jù) /etc/syslog.conf 的配置把 log 信息輸出到 /var/log/ 下的不同文件中 .

2 OOPS

Oops 中包含的重要信息對于所有體系結(jié)構(gòu)都是完全相同的 : 寄存器上下文和回溯線索 . 回溯線索顯示了導致錯誤發(fā)生的函數(shù)調(diào)用鏈 . 寄存器上下文信息可能同樣有用 , 盡管使用起來不那么方便 . 如果你有函數(shù)的匯編代碼 , 這些寄存器數(shù)據(jù)可以幫助你重建引發(fā)問題的現(xiàn)場 . 在寄存器中一個本不應(yīng)該出現(xiàn)的數(shù)值可能會在黑暗中給你帶來第一絲光明 .

[1] ksymoops

   提供編譯內(nèi)核是產(chǎn)生的 System.map 和模塊信息 ( 如何你使用的是模塊 ) OOPS 信息解碼 .

   $ ksymoops saved_oops.txt

[2] kallsysms

   開發(fā)版的 2.5 內(nèi)核引入了 kallsysms 特性 , 它可以通過定義 CONFIG_KALLSYMS 配置選項啟用 . 該選項可以載入內(nèi)核鏡像對應(yīng)的內(nèi)存地址的符號名稱 , 所以內(nèi)核可以打印解碼好的跟蹤線索 . 相應(yīng)地 , 解碼 oops 也不再需要 system.map 或者 ksysmoops 工具了 .

3 內(nèi)核調(diào)試配置選

    這些選項都在內(nèi)核配置編輯器的內(nèi)核開發(fā) (Kernel Hacking) 菜單中 , 他們都依賴于 CONFIG_DEBUG_KERNEL. 當你開發(fā)內(nèi)核的時候 , 作為一種練習 , 不妨都打開這些選項 .

[1] 調(diào)試原子操作

    把內(nèi)核配置成一旦在原子操作過程中進程進入休眠或者做了一些可能引起休眠的操作 , 就打印警告信息并提供追蹤線索 .

    CONFIG_PREEMPT = y

    CONFIG_DEBUG_KERNEL = y

    CONFIG_KALLSYMS = y

    CONFIG_SPINLOCK_SLEEP = y

4 引發(fā) bug 并打印信息

BUG() BUG_NO() 被調(diào)用時引發(fā) oops, 導致棧的回溯和錯誤信息的打印

panic() 不但會打印錯誤信息 , 而且會掛起整個系統(tǒng)

dump_stack() 在終端上打印寄存器上下文和函數(shù)跟蹤線索 .

5 神奇的 SysRq

    神奇系統(tǒng)請求鍵是另外一根救命稻草 , 該功能可以通過定義 CONFIG_MAGIC_SYSRQ 配置選項開啟用 . 當該功能被啟用的時候 , 無論內(nèi)核處于什么狀態(tài) , 你都可以通過特殊的組合鍵跟內(nèi)核進行通信 .

6 內(nèi)核調(diào)試器的傳奇

[1] gdb

    $ gdb vmlinux /proc/kcore

    > p global_variable

    > disassemble function

[2] kgdb

[3] kdb

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多