- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
讯息除错法
偵錯技術 Outline 介紹一系列專門用來對付核心程式的監視技術,以及追查錯誤的技巧 訊息除錯法 查詢除錯法 觀測除錯法 排除重大系統失誤 除錯工具 訊息除錯法 Printk()讓我們能指定訊息的”登載等級” 定義在linux/kernel.h所宣告的八個巨集中 下述代號展開之後,會分別成為012…7之類的字串,數字越低,等級越高 如果沒在printk()註明分類代碼,則訊息的預設分類為DEFAULT_MESSAGE_LOGLEVEL(參閱cd /usr /src /kernel /printk.c) P102 KERN_EMERG KERN_ALERT KERN_CRIT KERNERP KERN_WARING KERN_NOTICE KERN_INFO KERN_DEBUG Console_loglevel變數初值為default_console_loglevel,可用sys_syslog系統呼叫來改變此值(1.先殺掉執行中的klogd再以-c選項啟動之2.自己寫一個程式來觸發 書中範例:misc-progs/setlevel.c) 當在控制台上工作,遭遇到kernel fault,想調整console_level的現值可用簡單命令迫使所有核心訊息都出現在操控台上#echo 8 /proc/sys/kernel/printk 核心訊息輸出流程 printk()將訊息寫入一個環形佇列,然後喚醒正在等待的行程—也就是被syslog()系統呼叫推入修眠狀態或是正在讀取/proc/kmsg 日誌記錄引擎(syslogd和klogd),這兩種是等效的,但是直接讀取/proc/kmsg會消耗掉緩衝區裡的訊息,不會留給其他行程讀取;syslog()能讓我決定是否要將訊息留在緩衝區,也讓其他行程可以讀取。 訊息開關 研發驅動程式初期,printk()很好用,可以輔助測試~除錯程式碼,但是正式釋出驅動程式時,該如何亦切拿掉所有除錯用途的printk()? 1..修改巨集名稱,取消或恢復個別列印敘述2..只要在編譯之前變更cflags變數值,就可以關閉所有除錯訊息3..同樣的列印敘述,要同時可用在kernel-space與 user-space的程式裡,讓我們可以用一致方式來控制除錯訊息 P106 熟悉C preprocessor的人,甚至可以擴充巨集定義,做出除錯等級的效果,例如以不同數值定義不同等級的程度 查詢除錯法 大量使用printk()的結果,將明顯拖慢系統效能,因為syslogd必須隨時將取得的核心訊息寫入日誌檔,美印出一行訊息,就會引發一次磁碟動作 解決辦法1 : 修改/etc/syslog.conf,在日誌檔的檔名之前加一個減號(魔術記號,它要求syslogd不必每次收到新訊息就寫入磁碟) 解決辦法2 : 以其他程式來替代klogd(cat/proc/kmesg) 最佳辦法 : 是必要時才向系統查詢,Unix提供許多ps, netstat, vmstat等取得系統資訊的工具 對driver設計時而言,查詢系統資訊的主要管道有: ?將資訊輸出到/proc檔案系統. ?適用ioctl作業方式. 使用/proc檔案系統 /proc是靠軟體模擬出來的特殊檔案系統,並不實際存在於硬碟上,而是核心提供給user-space的資訊窗口 在proc/下的每一個檔案,接聯繫到核心內的專屬函式,這些函式在使用者讀取檔案時,及時產生檔案的內容 以/proc/modules為例,當你讀取它時它會顯示目前載入哪些模組,但此檔案系統的長度都為0. Linux許多系統工具,如ps, top,uptime等都是從 /proc取得它們所需要的資訊 全功能的 /proc檔案可以很複雜,不僅可被讀出資訊,甚至容許使用者寫入一些值,藉此改變特定核心功能的行為 任何欲支援/proc的模組,都必須引入linux/proc_fs.h,來定義適當的函式 建立/proc檔案 : 驅動程式必須製作一備查函式,讓它在檔案被存取的時,及時供應資料,核心也會配置一個記憶頁給它,核心會自動將我寫在該記憶頁的資料傳回user-space 備查函式介面: int (*read_proc)(char *page,char **start,off_t offset,int count,int *eof ,void *data); page指標:指向核心預先配置的記憶頁 start:用來表示有效資料的起點位置 eof:指向一個整數值,驅動程式以此值讓核心知道它沒有資料要傳回 offset:若檔案超過一記憶頁大小,可利用分批傳輸的方式,先將*start指向page,讓呼叫者知道新資料是放在page緩衝區的開頭,將*start指向offset
文档评论(0)