第十八章讀書筆記——調試

第十八章 調試

準備開始

準備工做須要的是:算法

  • 一個bug
  • 一個藏匿bug的內核版本
  • 相關內核代碼的知識和運氣

內核中的bug

內核bug的緣由可能有:安全

  • 錯誤代碼
  • 同步時發生的錯誤,例如共享變量鎖定不當
  • 錯誤的管理硬件

內核bug發做的症狀可能有:函數

  • 下降全部程序的運行性能
  • 毀壞數據
  • 使得系統處於死鎖狀態

經過打印來調試

這裏說的打印是指的內核的格式化打印函數printk(),由於它有本身的一些特殊的功能:oop

健壯性:健壯性的意思是,在任什麼時候候,任何地方都能調用它

  • 在中斷上下文和進程上下文中被調用
  • 在任何持有鎖時被調用
  • 在多處理器上同時被調用,而且沒必要使用鎖。性能

    彈性極佳

記錄緩衝區

內核消息是保存在一個環形隊列中,這個環形隊列就是它的記錄緩衝區
內核在同一時間只能保存16kb的內核消息,再多的話新消息就會覆蓋老消息,讀寫都是按照環形隊列方式操做的
優勢:ui

  • 健壯性:在中斷上下文中也能夠方便的使用
  • 簡單性:使記錄維護起來更容易
    缺點:可能會丟失消息

syslogd和klogd:這是兩個用戶空間的守護進程,klogd從記錄緩衝區中獲取內核消息,再經過syslogd守護進程將他們保存在系統日誌文件中。

klogd

能夠從/proc/kmsg文件中,也能夠經過syslog()系統調用讀取這些消息,默認是/proc方式
兩種狀況klogd都會阻塞,知道有新的內核消息可供讀出,喚醒以後默認處理是將消息傳給syslogd
能夠經過-c標誌來改變終端的記錄等級調試

syslogd

將它接收到的全部消息添加到一個文件中,默認是/var/log/messages日誌

oops

oops是內核告知用戶有不幸發生的最經常使用的方式
內核很難自我修復,也不能將本身殺死,只能發佈oops隊列

  • 向終端上輸出錯誤消息
  • 輸出寄存器中保存的信息
  • 輸出可供跟蹤的回溯線索進程

    一般發送完oops以後,內核會處於一種不穩定狀態

    oops發生的時機:
  • 發生在中斷上下文:內核沒法繼續,會陷入混亂,致使系統死機
  • 發生在idle進程或init進程(0號進程和1號進程),同上
  • 發生在其餘進程運行時,內核會殺死該進程並嘗試着繼續執行
    oops發生的可能緣由:
  • 內存訪問越界
  • 非法的指令
    oops中包含的重要信息:寄存器上下文和回溯線索

神奇的系統請求鍵

這個功能能夠經過定義CONFIG_MAGIC_SYSRQ配置選項來啓用
SysRq(系統請求)鍵在大多數鍵盤上都是標準鍵
該功能被啓用時,不管內核出於什麼狀態,均可以經過特殊的組合鍵和內核進行通訊

內核調試器的傳奇

gdb:
可使用標準的GNU調試器對正在運行的內核進行查看。
針對內核啓動調試器的方法與針對進程的方法大體相同:

侷限性:

  • 沒有辦法修改內核數據
  • 不能單步執行內核代碼
    kgdb:
    是一個補丁 ,可讓咱們在遠程主機上經過串口利用gdb的全部功能對內核進行調試
    須要兩臺計算機:儀態運行帶有kgdb補丁的內核,第二胎經過串行線使用gdb對第一臺進行調試
    經過kgdb,gdb的全部功能都能使用:
  • 讀取和修改變量值
  • 設置斷點
  • 設置關注變量
  • 單步執行
    探測系統
    --------
    使用uid做爲選擇條件:通常狀況下,加入特性時,只要保留原有的算法而把新算法加入到其餘位置上,基本就能保證安全

使用條件變量:
若是代碼與進程無關,或者但願有一個針對全部狀況都能使用的機制來控制某個特性,可使用條件變量
使用統計量:
這種方法經常使用於使用者須要掌握某個特定事件的發生規律的時候
方法是建立統計量,並提供某種機制訪問其統計結果

重複頻率限制
當系統的調試信息過多的時候,有兩種方式能夠防止這類問題發生:

重複頻率限制
發生次數限制

  • 重複頻率限制
  • 發生次數限制

總結:

這一章中 ,學到了有關內核bug和調試的不少知識。

相關文章
相關標籤/搜索