伊人99re_av日韩成人_91高潮精品免费porn_色狠狠色婷婷丁香五月_免费看的av_91亚色网站

中培偉業(yè)IT資訊頻道
您現(xiàn)在的位置:首頁(yè) > IT資訊 > IT運(yùn)維 > 如何調(diào)試Linux內(nèi)核?如何區(qū)別Linux的內(nèi)核?

如何調(diào)試Linux內(nèi)核?如何區(qū)別Linux的內(nèi)核?

2020-09-11 17:05:30 | 來(lái)源:中培企業(yè)IT培訓(xùn)網(wǎng)

盡管Linux作為是一個(gè)操作系統(tǒng),但歸根結(jié)底,它仍然是一個(gè)程序。由于Linux是一個(gè)程序,因此可以通過(guò)debug來(lái)調(diào)試。但是,由于環(huán)境的不同,使用的方法和工具也不同。那么如何調(diào)試Linux內(nèi)核?如何區(qū)別Linux的內(nèi)核?Gdb是Linux下的常見(jiàn)調(diào)試工具,而Windows上的更多調(diào)試工具都是基于接口的。直接對(duì)應(yīng)的中間變量的值和所請(qǐng)求存儲(chǔ)器的地址將直觀顯示。在Linux上,主要通過(guò)命令查看它。實(shí)際上,它是命令的行的使用,這也是一些常見(jiàn)的命令。

  如何調(diào)試Linux內(nèi)核?

  一、調(diào)試前的準(zhǔn)備

內(nèi)核級(jí)bug具有行為不可靠,定義不清晰或者說(shuō)很難再現(xiàn)的諸多特定,為內(nèi)核級(jí)的bug跟蹤和調(diào)試帶來(lái)了很大的困難。

對(duì)于一些定義不清楚地bug,問(wèn)題的關(guān)鍵就是找到bug的源頭,很多時(shí)候,當(dāng)你精確地重現(xiàn)一個(gè)bug的時(shí)候,你就離成功不遠(yuǎn)了。

  二、內(nèi)核中的bug

從隱藏在源代碼中的錯(cuò)誤到展現(xiàn)在目擊者面前的bug,其發(fā)作往往是一系列連鎖反應(yīng)的事件才可能出發(fā)的。

雖然內(nèi)核調(diào)試有一定的困難,但是通過(guò)你的努力和理解,說(shuō)不定你會(huì)喜歡上這樣的挑戰(zhàn)。

  三、printk()

內(nèi)核提供的格式化打印函數(shù)。

1、printk函數(shù)的健壯性

健壯性是printk最容易被接受的一個(gè)特質(zhì),幾乎在任何地方,任何時(shí)候內(nèi)核都可以調(diào)用它(中斷上下文、進(jìn)程上下文、持有鎖時(shí)、多處理器處理時(shí)等)。

在系統(tǒng)啟動(dòng)過(guò)程中,終端初始化之前,在某些地方是不能調(diào)用的。

2、記錄等級(jí)

printk函數(shù)可以指定一個(gè)記錄級(jí)別,內(nèi)核根據(jù)這個(gè)級(jí)別來(lái)判斷是否在終端上打印消息。

記錄級(jí)別定義在中。

調(diào)用方式:printk(KER_DEBUG“Thisisadebugnotice!/n”);內(nèi)核用這個(gè)指定的紀(jì)錄等級(jí)和當(dāng)前終端的紀(jì)錄等級(jí)console_loglevel比較,來(lái)決定是不是向終端打印。

  3、記錄緩沖區(qū)

內(nèi)核消息都被保存在一個(gè)LOG_BUF_LEN大小的環(huán)形隊(duì)列中。

關(guān)于LOG_BUF_LEN定義:

#define__LOG_BUF_LEN(1<

變量CONFIG_LOG_BUF_SHIFT在內(nèi)核編譯時(shí)由配置文件定義,對(duì)于i386平臺(tái),其值定義如下(在Linux26/arch/i386/defconfig中):

CONFIG_LOG_BUF_SHIFT=18

  緩沖區(qū)操作:

①消息被讀出到用戶(hù)空間時(shí),此消息就會(huì)從環(huán)形隊(duì)列中刪除。

②當(dāng)消息緩沖區(qū)滿(mǎn)時(shí),如果再有printk()調(diào)用時(shí),新消息將覆蓋隊(duì)列中的老消息。

③在讀寫(xiě)環(huán)形隊(duì)列時(shí),同步問(wèn)題很容易得到解決。

這個(gè)紀(jì)錄緩沖區(qū)之所以稱(chēng)為環(huán)形,是因?yàn)樗淖x寫(xiě)都是按照環(huán)形隊(duì)列的方式進(jìn)行操作的。

4、syslogd和klogd

在標(biāo)準(zhǔn)的Linux系統(tǒng)上,用戶(hù)空間的守護(hù)進(jìn)程klogd從紀(jì)錄緩沖區(qū)中獲取內(nèi)核消息,再通過(guò)syslogd守護(hù)進(jìn)程把這些消息保存在系統(tǒng)日志文件中。klogd進(jìn)程既可以從/proc/kmsg文件中,也可以通過(guò)syslog()系統(tǒng)調(diào)用讀取這些消息。默認(rèn)情況下,它選擇讀取/proc方式實(shí)現(xiàn)。klogd守護(hù)進(jìn)程在消息緩沖區(qū)有新的消息之前,一直處于阻塞狀態(tài)。一旦有新的內(nèi)核消息,klogd被喚醒,讀出內(nèi)核消息并進(jìn)行處理。默認(rèn)情況下,處理例程就是把內(nèi)核消息傳給syslogd守護(hù)進(jìn)程。

syslogd守護(hù)進(jìn)程一般把接收到的消息寫(xiě)入/var/log/messages文件中。不過(guò),還是可以通過(guò)/etc/syslog.conf文件來(lái)進(jìn)行配置,可以選擇其他的輸出文件。

  四、OOPS

作為內(nèi)核的開(kāi)發(fā)者,必定將會(huì)經(jīng)常處理OOPS。

  ksymoops

在Linux中,調(diào)試系統(tǒng)崩潰的傳統(tǒng)方法是分析在發(fā)生崩潰時(shí)發(fā)送到系統(tǒng)控制臺(tái)的Oops消息。一旦您掌握了細(xì)節(jié),就可以將消息發(fā)送到ksymoops實(shí)用程序,它將試圖將代碼轉(zhuǎn)換為指令并將堆棧值映射到內(nèi)核符號(hào)。

ksymoops需要幾項(xiàng)內(nèi)容:Oops消息輸出、來(lái)自正在運(yùn)行的內(nèi)核的System.map文件,還有/proc/ksyms、vmLinux和/proc/modules。

關(guān)于如何使用ksymoops,內(nèi)核源代碼/usr/src/Linux/Documentation/oops-tracing.txt中或ksymoops手冊(cè)頁(yè)上有完整的說(shuō)明可以參考。Ksymoops反匯編代碼部分,指出發(fā)生錯(cuò)誤的指令,并顯示一個(gè)跟蹤部分表明代碼如何被調(diào)用。

#cat/proc/kallsyms

c0100240T_stext

c0100240trun_init_process

c0100240Tstext

c0100269tinit

  五、內(nèi)核調(diào)試配置選項(xiàng)

在編譯內(nèi)核的時(shí)候,為了方便調(diào)試和測(cè)試代碼,內(nèi)核提供了許多配置選項(xiàng)。

  調(diào)試原子操作

從內(nèi)核2.5開(kāi)發(fā),為了檢查各類(lèi)由原子操作引發(fā)的問(wèn)題,內(nèi)核提供了極佳的工具。

內(nèi)核提供了一個(gè)原子操作計(jì)數(shù)器,它可以配置成,一旦在原子操作過(guò)程中,進(jìn)城進(jìn)入睡眠或者做了一些可能引起睡眠的操作,就打印警告信息并提供追蹤線索。

所以,包括在使用鎖的時(shí)候調(diào)用schedule(),正使用鎖的時(shí)候以阻塞方式請(qǐng)求分配內(nèi)存等,各種潛在的bug都能夠被探測(cè)到。

下面這些選項(xiàng)可以最大限度地利用該特性:

CONFIG_PREEMPT=y

CONFIG_DEBUG_KERNEL=y

CONFIG_KLLSYMS=y

CONFIG_SPINLOCK_SLEEP=y

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

1、一些內(nèi)核調(diào)用可以用來(lái)方便標(biāo)記bug,提供斷言并輸出信息。最常用的兩個(gè)是BUG()和BUG_ON()。

當(dāng)調(diào)用這兩個(gè)宏的時(shí)候,它們會(huì)引發(fā)OOPS,導(dǎo)致棧的回溯和錯(cuò)誤消息的打印。

2、dump_stack()

有些時(shí)候,只需要在終端上打印一下棧的回溯信息來(lái)幫助你調(diào)試。這時(shí)可以使用dump_stack()。這個(gè)函數(shù)只在終端上打印寄存器上下文和函數(shù)的跟蹤線索。

if(!debug_check){

printk(KERN_DEBUG“providesomeinformation…/n”);

dump_stack();

}

  如何區(qū)別Linux的內(nèi)核?

Linux是一種開(kāi)源電腦操作系統(tǒng)內(nèi)核。它是一個(gè)用C語(yǔ)言寫(xiě)成,符合POSIX標(biāo)準(zhǔn)的類(lèi)Unix操作系統(tǒng)。Linux最早是由芬蘭黑客LinusTorvalds為嘗試在英特爾x86架構(gòu)上提供自由免費(fèi)的類(lèi)Unix操作系統(tǒng)而開(kāi)發(fā)的。該計(jì)劃開(kāi)始于1991年,在計(jì)劃的早期有一些Minix黑客提供了協(xié)助,而今天全球無(wú)數(shù)程序員正在為該計(jì)劃無(wú)償提供幫助。

內(nèi)核不止一種,所以我們應(yīng)該怎么區(qū)別呢?

Linux的內(nèi)核版本有兩種:1穩(wěn)固版2開(kāi)發(fā)版。

Linux內(nèi)核版本號(hào)是由3個(gè)數(shù)字構(gòu)成:a.b.c

a:目前發(fā)布的內(nèi)核主版本。

b:偶數(shù)表示穩(wěn)固版本;奇數(shù)表示開(kāi)發(fā)中版本。

c:錯(cuò)誤修補(bǔ)的次數(shù)。

其中第一個(gè)數(shù)字是主版本號(hào),第二個(gè)數(shù)字是次版本號(hào),第三個(gè)數(shù)字是修訂版本號(hào)。

上述就是關(guān)于如何調(diào)試Linux內(nèi)核,以及如何區(qū)別Linux內(nèi)核的全部?jī)?nèi)容,想了解更多關(guān)于Linux的信息,請(qǐng)繼續(xù)關(guān)注中培偉業(yè)。

主站蜘蛛池模板: 国产成人亚洲精品影院 | 亚洲人成无码制服中文字幕 | 国产伦精品一区二区三区高清 | 人妻出轨中文字幕不卡一区 | 久久精品日产第一区二区三区的功能 | 一及黄色片子 | 欧美精品日日鲁夜夜添 | 午夜av网站| 成熟女人牲交片免费观看视频 | 欧美顶级毛片在线播放 | 绯色一区二区三区不卡少妇 | 床震吃胸膜奶免费视频 | 亚洲欧洲日本无在线码播放 | 裸体美女扒开尿口 | 日本不卡在线一区二区三区视频 | 国产精品无码一区二区三区免费 | 69精品视频在线观看 | 中文字幕有码无码人妻AV蜜桃 | 雪白浑圆高耸光滑呻吟 | 亚洲国产aⅴ精品一区二区 baoyu116.永久免费视频 | 日本少妇又色又爽又高潮看你 | 欧美变态xxxx | 狠操av| 亚洲AV成人无码网站在线 | 亚洲国产另类精品专区 | 国产学生系列一区二区三区 | 亚洲人成网站观看在线播放 | 国产在线青青草 | 国产精品日本一区二区三区在线 | 亚洲欧美久久精品 | 天天操91| 亚洲av成人无码久久精品 | 亚洲VA999成人A片在线观看 | 黑人狂桶女人高潮嗷嗷叫小说 | 好紧好滑好湿好爽免费视频 | 国产国拍亚洲精品MV在线观看" | 精品无码一区二区三区在线 | 久久久国语 | 免费看的av| 中文字幕一区二区三区乱码图片 | 欧美不卡在线一区二区三区 |