讯息除错法(1)_第1页
讯息除错法(1)_第2页
讯息除错法(1)_第3页
讯息除错法(1)_第4页
讯息除错法(1)_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CHAP4 訊息除錯法 1 printk 函式通用的除錯技巧 對應用程式而言使用printf 對於核心程式而言則使用printk printk 能讓你指定訊息的loglevel 等級 共分為八纇 定義在裡 KERN EMERG 緊急訊息 出現在系統崩潰前 KERN ALERT 危險通知 發生在需要立即採取行動的事件 KERN CRIT 嚴重狀況 涉及硬體或軟體故障 訊息除錯法 2 KERN ERR 錯誤狀況回報 通常回報硬體上的困難 KERN WARNING 緊急訊息 程度上不影響系統 NERN NOTICE 通知 意料中會發生且值得注意的狀況 KERN INFO 資訊性訊息 driver在啟動階段所印出的硬體資訊 KERN DEBUG 供除錯用途的訊息 訊息除錯法 3 上述代號展開後分別成為 之類的字串 括弧內數字越低表示等級越高 ex printk KERN DEBUG HI 不同等級的訊息會被輸出到不同的地點 有可能是目前的操控台 console 或者是某種文字終端機 Xterm視窗 Telnet或SSH連線 任何等值低於console loglevel的變數訊息都會被顯示在操控台上 console 不過若系統上同時執行klogd與syslogd不管console loglevel的值為何 所有核心訊息都會被加入 var log messages 訊息除錯法 4 如果沒跑klogd 則訊息不會流入user space 除非主動讀取 proc kmsg 修改console loglevel的值 使用sys syslog 利用klogd的 c選項 本書範例 misc progs setlevel c 2 1 31版本開始 可以直接透 proc sys kernel printk檔案來修改或檢視console levle的值 echo8 proc sys kernel printk 核心訊息的輸出流程 1 printk 會將訊息寫入一個環型queue 長度為LOG BUF LEN 定義在kernel printk c 且喚醒 正在等待訊息的行程 使用syslog 正在讀取 proc kmesg的行程 在環型queue被填滿時 printk 將會繞回原點 將新訊息覆蓋在最就訊息上 其優點 固定記憶體 既使沒跑日誌紀錄引擎 klogd syslogd 也不至於消耗所有的記憶體 核心內部到處都可以直接呼叫printk 核心訊息的輸出流程 2 klogd所取得的核心訊息會被轉交給syslogd 由他依據 etc syslog conf來決定如何處裡收到的訊息 若系統沒跑klogd 核心訊息將會一值留在環型佇列 直到有人讀取他或者是被新訊息蓋掉 若不希望driver所發出得訊息擾亂的系統的日誌檔 可以用 f選項來從新啟動klogd並將其訊息寫入特定檔案 kernel proc kmsg klogd dev log syslogd syslog conf 查詢除錯法 1 大量使用printk 的結果將導致系統效能變慢 因為syslogd每次必須隨時將取得的核心訊息寫入日誌檔 一般而言 取得相關資訊的最佳辦法 是再必要時才向系統查詢 Unix提供許多ps netstat vmstat等取得系統資訊的工具 對driver設計時而言 查詢系統資訊的只要管道有 將資訊輸出到 proc檔案系統 適用ioctl作業方式 查詢除錯法 2 使用 proc檔案系統 proc是靠軟體模擬出來的特殊檔案系統 並不實際存在於硬碟上 而是核心提供給user space的資訊窗口 在proc 下的每一個檔案 接聯繫到核心內的專屬函式 這些函式在使用者讀取檔案時 及時產生檔案的內容 ex 以 proc modules為例 當你讀取它時它會顯示目前載入哪些模組 但此檔案系統的長度都為0 查詢除錯法 3 使用 proc檔案系統 Linux許多系統工具 如ps top uptime等都是從 proc取的它們所需要的資訊 建立 proc檔案 driver必須製作一備查程式 讓它在檔案被存取的時 及時供應資料 核心也會配置一記憶頁給它備查程式介面 int read proc char page char start off toffset intcount int eof void data read proc 備查函式 記憶頁 User space 查詢除錯法 4 使用 proc檔案系統 page指標 指向核心預先配置的記憶頁 start與offset 若檔案超過一記憶頁大小 可利用分批傳輸的方式 先將 start指向page再利用offset指向下一各位元組 skcull程式中有對read proc的實作 intscull read procmem char buf char start off toffset intcount int eof void data inti j len 0 intlimit count 80 Don tprintmorethanthis for i 0 isem return ERESTARTSYS len sprintf buf len nDevice i qset i q i sz li n i d qset d quantum d size for d 查詢除錯法 5 使用 proc檔案系統 定義好read proc作業方式後 必須為它在 proc下設置一個入口點 使用create proc read entry 若希望使用者能透過 proc scullmem取得該函式提供的資料 則driver需宣告如下 staticvoidscull create proc create proc read entry scullmem 0 預設模式 0 x444 NULL 上層目錄 proc dir entry scull read procmem NULL 提供給read proc使用的資料 proc入口點名稱 檔案權限 入口點上層目錄 read proc作業方法的指標 傳給read proc的資料的指標 查詢除錯法 6 使用 proc檔案系統 第三參數的說明 在 proc檔案系統下的每一個子目錄 都有各自專屬的proc dir entry結構來描述 ex 描述 proc driver子目錄的結構為proc root driver 描述 proc bus子目錄的結構為proc bus 若此引數設定為NULL代表入口點設置在 proc目錄下 查詢除錯法 7 使用 proc檔案系統 staticvoidscull create proc create proc read entry scullmem 0 預設模式 0 x444 proc root driver 代表 proc driver子目錄 scull read procmem NULL 提供給read proc使用的資料 ex 在 proc子目錄下 proc driver 建立新入口點 查詢除錯法 6 使用 proc檔案系統 建立新的 proc子目錄 利用proc mkdir structproc dir entry scull procdir NULL staticvoidscull create proc 建立 proc scull子目錄scull procdir proc mkdir scull NULL create proc read entry scullmem 0 scull procdir scull read proc NULL 查詢除錯法 7 使用 proc檔案系統 在模組被載卸之前必須先移除相關的 proc入口點 使用remove proc entry 移除 proc scullmem remove pcor entry scullmem NULL 移除 proc driver scullmem remove proc entry scullmem proc root driver 移除 proc scull scullmem remove proc entry scullmem scull procdir 查詢除錯法 8 使用ioctl Ioctl 是作用在 檔案描述單元 filedescriptor 的一種systemcall 比讀取 proc的速度快 沒有記憶頁的限制 不同於任何人都可見的 proc檔案 ioctl能將擷取除錯資訊的功能留在驅動程式裡面 詳情請期待第五章 觀測除錯法 strace 檢驗位於kernel space的程式碼 能顯示出由user space程式所發出的所有systemcall stracels dev dev scull0 排除重大系統錯誤 1 除了監視 除錯技術 驅動程式可能還是意料之外的bug存在 嚴重可能造成systemfault fault 失誤 不等於panic 死當 失誤通常會摧毀目前的行程 系統本身能正常 若fault發生在processcontext之外 或是破壞系統的關鍵部分 即有可能早成panic oops訊息 往往發生在不當的操作指標所引起 如dereference 提領 或者是誤用指標的值 排除重大系統錯誤 2 pagefault 在protectmode 保護模式 下 所使用的是virtualaddress 虛擬記憶體 藉由pagetable換算出physicaladdress 實體位置 若程式提領一個無效指標 分頁機制則沒有辦法算出實體位置 因而發生pagefault 若在user space發生提領無效 後果頂多是無法 pagein 該位址 若發生在kernel則迫使核心發出oops訊息 排除重大系統錯誤 2 範例 misc modules faulty c ssize tfaulty write structfile filp constchar buf size tcount loff t pos 提領一個NULL指標 刻意製造簡單的fault狀況 int 0 0 return0 0不是合理指標值 排除重大系統錯誤 3 oops訊息包括 fault當時CPU的狀態 包括各站存器的值等 ksymoops用法 systme map檔 v usr src linux system map模組清單 l proc modules核心符號表 k proc ksyms映像檔 v 模組object檔存放位置 o 指令 ksymoops v usr src linux 2 4 20 8 vmlinux m usr src linux 2 4 20 8 Systme mapoops txt EIP df8a90e3Trace c0109537Code df8a90e300000000 Code df8a90e37 000000Code df8a90eda 31c0 xor eax eaxCode df8a90efc c9leaveCode df8a90f0d c3retCode df8a90f1e 8d7600lea0 x0 esi esiCode df8a90f411 55push ebpCode df8a90f512 89e5mov esp ebp gdb使用 指令 gdb usr src linux vmlinux proc kcore gdb x iEx gdb x 20i0 xc800206

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论