linux調(diào)試技術(shù)介紹

linux調(diào)試技術(shù)介紹

ID:14327327

大?。?9.50 KB

頁數(shù):26頁

時間:2018-07-27

linux調(diào)試技術(shù)介紹_第1頁
linux調(diào)試技術(shù)介紹_第2頁
linux調(diào)試技術(shù)介紹_第3頁
linux調(diào)試技術(shù)介紹_第4頁
linux調(diào)試技術(shù)介紹_第5頁
資源描述:

《linux調(diào)試技術(shù)介紹》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫

1、Linux調(diào)試技術(shù)介紹對于任何編寫內(nèi)核代碼的人來說,最吸引他們注意的問題之一就是如何完成調(diào)試。由于內(nèi)核是一個不與某個進程相關(guān)的功能集,其代碼不能很輕松地放在調(diào)試器中執(zhí)行,而且也不能跟蹤。本章介紹你可以用來監(jiān)視內(nèi)核代碼和跟蹤錯誤的技術(shù)。用打印信息調(diào)試  最一般的調(diào)試技術(shù)就是監(jiān)視,就是在應(yīng)用內(nèi)部合適的點加上printf調(diào)用。當你調(diào)試內(nèi)核代碼的時候,你可以用printk完成這個任務(wù)。Printk  在前些章中,我們簡單假設(shè)printk工作起來和printf很類似?,F(xiàn)在是介紹一下它們之間不同的時候了?! ∑渲幸粋€不同點就是,printk允許你根據(jù)它們的嚴重程度,通過附加不同的“記錄級”

2、來對消息分類,或賦予消息優(yōu)先級。你可以用宏來指示記錄級。例如,KERN_INFO,我們前面已經(jīng)看到它被加在打印語句的前面,它就是一種可能的消息記錄級。記錄級宏展開為一個字串,在編譯時和消息文本拼接在一起;這也就是為什么下面的例子中優(yōu)先級和格式字串間沒有逗號。這有兩個printk的例子,一個是調(diào)試信息,一個是關(guān)鍵信息:(代碼)  在中定義了8種記錄級別串。沒有指定優(yōu)先級的printk語句默認使用DEFAULT_MESSAGE_LOGLEVEL優(yōu)先級,它是一個在kernel/printk.c中定義的整數(shù)。默認記錄級的具體數(shù)值在Linux的開發(fā)期間曾變化過若干次,所以我建議你最好總是

3、指定一個合適的記錄級?! 「鶕?jù)記錄級,內(nèi)核將消息打印到當前文本控制臺上:如果優(yōu)先級低于console_loglevel這個數(shù)值的話,該消息就顯示在控制臺上。如果系統(tǒng)同時運行了klogd和syslogd,無論console_loglevel為何值,內(nèi)核都將消息追加到/var/log/messages中?! ∽兞縞onsole_loglevel最初初始化為DEFAULT_CONSOLE_LOGLEVEL,但可以通過sys_syslog系統(tǒng)調(diào)用修改。如klogd的手冊所示,可以在啟動klogd時指定-c開關(guān)來修改這個變量。此外,你還可以寫個程序來改變控制臺記錄級。你可以在O'Reil

4、ly站點上的源文件中找到我寫的一個這種功能的程序,miscprogs/setlevel.c。新優(yōu)先級是通過一個1到8之間的整數(shù)值指定的。  你也許需要在內(nèi)核失效后降低記錄級(見“調(diào)試系統(tǒng)故障”),這是因為失效處理代碼會將console_loglevel提升到15,之后所有的消息都會出現(xiàn)在控制臺上。為看到你的調(diào)試信息,如果你運行的是內(nèi)核2.0.x話,你需要提升記錄級。內(nèi)核2.0發(fā)行降低了MINIMUM_CONSOLE_LOGLEVEL,而舊版本的klogd默認情況下要打印很多控制消息。如果你碰巧使用了這個舊版本的守護進程,除非你提升記錄級,內(nèi)核2.0會比你預期的打印出更少的消息。

5、這就是為什么hello.c中使用了標記,這樣可以保證消息顯示在控制臺上。  從1.3.43一來的內(nèi)核版本通過允許你向指定虛控制臺發(fā)送消息,藉此提供一個靈活的記錄策略。默認情況下,“控制臺”是當前虛終端。也可以選擇不同的虛終端接收消息,你只需向所選的虛終端調(diào)用ioctl(TIOCLINUX)。如下程序,setconsole,可以用來選擇哪個虛終端接收內(nèi)核消息;它必須以超級用戶身份運行。如果你對ioctl還不有把握,你可以跳過這至下一節(jié),等到讀完第5章“字符設(shè)備驅(qū)動程序的擴展操作”的“ioctl”一節(jié)后,再回到這里讀這段代碼。(代碼)  setconsole使用了用于Linux專用

6、功能的特殊的ioctl命令TIOCLINUX。為了使用TIOCLINUX,你要傳遞給它一個指向字節(jié)數(shù)組的指針。數(shù)組的第一個字節(jié)是所請求的子命令的編碼,隨后的字節(jié)依命令而不同。在setconsole中使用了子命令11,后一個字節(jié)(存放在bytes[1]中)標別虛擬控制臺。TIOCLINUX的完成介紹可以在內(nèi)核源碼drivers/char/tty_io.c中找到。消息是如何記錄的  printk函數(shù)將消息寫到一個長度為LOG_BUF_LEN個字節(jié)的循環(huán)緩沖區(qū)中。然后喚醒任何等待消息的進程,即那些在調(diào)用syslog系統(tǒng)調(diào)用或讀取/proc/kmesg過程中睡眠的進程。這兩個訪問記錄引

7、擎的接口是等價的。不過/proc/kmesg文件更象一個FIFO文件,從中讀取數(shù)據(jù)更容易些。一條簡單的cat命令就可以讀取消息。  如果循環(huán)緩沖區(qū)填滿了,printk就繞到緩沖區(qū)的開始處填寫新數(shù)據(jù),覆蓋舊數(shù)據(jù)。于是記錄進程就丟失了最舊的數(shù)據(jù)。這個問題與利用循環(huán)緩沖區(qū)所獲得的好處相比可以忽略不計。例如,循環(huán)緩沖區(qū)可以使系統(tǒng)在沒有記錄進程的情況下照樣運行,同時又不浪費內(nèi)存。Linux處理消息的方法的另一個特點是,可以在任何地方調(diào)用printk,甚至在中斷處理函數(shù)里也可以調(diào)用,而且對數(shù)據(jù)量的大小沒

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。