4.1. 內(nèi)核中的調(diào)試支持

2018-02-24 15:49 更新

4.1.?內(nèi)核中的調(diào)試支持

在第 2 章, 我們建議你建立并安裝你自己的內(nèi)核, 而不是運(yùn)行來自你的發(fā)布商的現(xiàn)成的內(nèi)核. 運(yùn)行你自己的內(nèi)核的最充分的理由之一是內(nèi)核開發(fā)者已經(jīng)在內(nèi)核自身中構(gòu)建了多個調(diào)試特性. 這些特性能產(chǎn)生額外的輸出并降低性能, 因此發(fā)布商的產(chǎn)品內(nèi)核中往往不會使能它們. 作為一個內(nèi)核開發(fā)者, 但是, 你有不同的優(yōu)先權(quán)并且會樂于接收這些格外的內(nèi)核調(diào)試支持帶來的開銷.

這里, 我們列出用來開發(fā)的內(nèi)核應(yīng)當(dāng)激活的配置選項. 除了另外指出的, 所有的這些選項都在 "kernel hacking" 菜單, 不管什么樣的你喜歡的內(nèi)核配置工具. 注意有些選項不是所有體系都支持.

CONFIG_DEBUG_KERNEL
這個選項只是使其他調(diào)試選項可用; 它應(yīng)當(dāng)打開, 但是它自己不激活任何的特性.

CONFIG_DEBUG_SLAB
這個重要的選項打開了內(nèi)核內(nèi)存分配函數(shù)的幾類檢查; 激活這些檢查, 就可能探測到一些內(nèi)存覆蓋和遺漏初始化的錯誤. 被分配的每一個字節(jié)在遞交給調(diào)用者之前都設(shè)成 0xa5, 隨后在釋放時被設(shè)成 0x6b. 你在任何時候如果見到任一個這種"壞"模式重復(fù)出現(xiàn)在你的驅(qū)動輸出(或者常常在一個 oops 的列表), 你會確切知道去找什么類型的錯誤. 當(dāng)激活調(diào)試, 內(nèi)核還會在每個分配的內(nèi)存對象的前后放置特別的守護(hù)值; 如果這些值曾被改動, 內(nèi)核知道有人已覆蓋了一個內(nèi)存分配區(qū), 它大聲抱怨. 各種的對更模糊的問題的檢查也給激活了.

CONFIG_DEBUG_PAGEALLOC
滿的頁在釋放時被從內(nèi)核地址空間去除. 這個選項會顯著拖慢系統(tǒng), 但是它也能快速指出某些類型的內(nèi)存損壞錯誤.

CONFIG_DEBUG_SPINLOCK
激活這個選項, 內(nèi)核捕捉對未初始化的自旋鎖的操作, 以及各種其他的錯誤( 例如 2 次解鎖同一個鎖 ).

CONFIG_DEBUG_SPINLOCK_SLEEP
這個選項激活對持有自旋鎖時進(jìn)入睡眠的檢查. 實(shí)際上, 如果你調(diào)用一個可能會睡眠的函數(shù), 它就抱怨, 即便這個有疑問的調(diào)用沒有睡眠.

CONFIG_INIT_DEBUG
init (或者 initdata) 標(biāo)志的項在系統(tǒng)初始化或者模塊加載后都被丟棄. 這個選項激活了對代碼的檢查, 這些代碼試圖在初始化完成后存取初始化時內(nèi)存.

CONFIG_DEBUG_INFO
這個選項使得內(nèi)核在建立時包含完整的調(diào)試信息. 如果你想使用 gdb 調(diào)試內(nèi)核, 你將需要這些信息. 如果你打算使用 gdb, 你還要激活 CONFIG_FRAME_POINTER.

CONFIG_MAGIC_SYSRQ
激活"魔術(shù) SysRq"鍵. 我們在本章后面的"系統(tǒng)掛起"一節(jié)查看這個鍵.

CONFIG_DEBUG_STACKOVERFLOWCONFIG_DEBUG_STACK_USAGE
這些選項能幫助跟蹤內(nèi)核堆棧溢出. 堆棧溢出的確證是一個 oops 輸出, 但是沒有任何形式的合理的回溯. 第一個選項給內(nèi)核增加了明確的溢出檢查; 第 2 個使得內(nèi)核監(jiān)測堆棧使用并作一些統(tǒng)計, 這些統(tǒng)計可以用魔術(shù) SysRq 鍵得到.

CONFIG_KALLSYMS
這個選項(在"Generl setup/Standard features"下)使得內(nèi)核符號信息建在內(nèi)核中; 缺省是激活的. 符號選項用在調(diào)試上下文中; 沒有它, 一個 oops 列表只能以 16 進(jìn)制格式給你一個內(nèi)核回溯, 這不是很有用.

CONFIG_IKCONFIGCONFIG_IKCONFIG_PROC
這些選項(在"Generl setup"菜單)使得完整的內(nèi)核配置狀態(tài)被建立到內(nèi)核中, 可以通過 /proc 來使其可用. 大部分內(nèi)核開發(fā)者知道他們使用的哪個配置, 并不需要這些選項(會使得內(nèi)核更大). 但是如果你試著調(diào)試由其他人建立的內(nèi)核中的問題, 它們可能有用.

CONFIG_ACPI_DEBUG
在"Power management/ACPI"下. 這個選項打開詳細(xì)的 ACPI (Advanced Configuration and Power Interface) 調(diào)試信息, 它可能有用如果你懷疑一個問題和 ACPI 相關(guān).

CONFIG_DEBUG_DRIVER
在"Device drivers"下. 打開了驅(qū)動核心的調(diào)試信息, 可用以追蹤低層支持代碼的問題. 我們在第 14 章查看驅(qū)動核心.

CONFIG_SCSI_CONSTANTS
這個選項, 在"Device drivers/SCSI device support"下, 建立詳細(xì)的 SCSI 錯誤消息的信息. 如果你在使用 SCSI 驅(qū)動, 你可能需要這個選項.

CONFIG_INPUT_EVBUG
這個選項(在"Device drivers/Input device support"下)打開輸入事件的詳細(xì)日志. 如果你使用一個輸入設(shè)備的驅(qū)動, 這個選項可能會有用. 然而要小心這個選項的安全性的隱含意義: 它記錄了你鍵入的任何東西, 包括你的密碼.

CONFIG_PROFILING
這個選項位于"Profiling support"之下. 剖析通常用在系統(tǒng)性能調(diào)整, 但是在追蹤一些內(nèi)核掛起和相關(guān)問題上也有用.

我們會再次遇到一些上面的選項, 當(dāng)我們查看各種方法來追蹤內(nèi)核問題時. 但是首先, 我們要看一下經(jīng)典的調(diào)試技術(shù): print 語句.

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號