在第2 章, 我們建議你建立並安裝你自己的內核, 而不是運行來自你的發布商的現成的內核. 運行你自己的內核的最充分的理由之一是內核開發者已經在內核自身中構建了多個debug特性. 這些特性能產生額外的輸出並降低性能, 因此發布商的產品內核中往往不會啟動它們. 但是, 作為一個內核開發者, 你有不同的優先權並且會樂於接收這些格外的內核debug支持帶來的開銷.
這裡, 我們列出用來開發的內核應當啟動的配置選項. 除了另外註明, 不管你喜歡什麼樣的內核配置工具,所有的這些選項都在"kernel hacking" 菜單, . 注意有些選項不是所有體系都支援.
CONFIG_DEBUG_KERNEL
這個選項只是使其他debug選項可用; 它應當打開, 但是它自己不啟動任何的特性.
CONFIG_DEBUG_SLAB
這個重要的選項打開了內核memory allocation函數的幾項檢查; 啟動這些檢查, 就可能探測到一些記憶體覆蓋和遺漏初始化的錯誤. 在遞交給call者之前,被allocated的每一個byte都設成0xa5,隨後在釋放時被設成0x6b. 如果你在任何時候見到任一個這種"posion"模式重複出現在你的driver輸出(或者常常在一個oops 的列表), 你會確切知道去找什麼類型的錯誤. 當啟動debug, 內核還會在每個allocated memory對象的前後放置特別的guarded values; 如果這些值曾被改動, 內核知道有人已覆蓋了一個memory allocation, 它會出現警示. 對更模糊的問題的各種檢查也給啟動了.
CONFIG_DEBUG_PAGEALLOC
full pages在釋放時被從kernel address space去除. 這個選項會顯著拖慢系統, 但是它也能快速指出某些類型的memory損壞錯誤.
CONFIG_DEBUG_SPINLOCK
啟動這個選項, 內核捕捉對未初始化的spinlcok的操作, 以及各種其他的錯誤( 例如2 次解鎖同一個鎖).
CONFIG_DEBUG_SPINLOCK_SLEEP
這個選項啟動對持有spinlcok時進入sleep的檢查. 實際上, 如果你call一個可能會sleep的函數, 它就出現警示, 即便這個有疑問的call沒有sleep.
CONFIG_INIT_DEBUG
用__init (或者__initdata) 標誌的項目在系統初始化或者module加載後都被丟棄. 這個選項啟動了對代碼的檢查, 這些代碼試圖在初始化完成後存取初始化時的memory.
CONFIG_DEBUG_INFO
這個選項使得內核在建立時包含完整的debug信息. 如果你想使用gdb debug內核, 你將需要這些信息. 如果你打算使用gdb, 你還要啟動CONFIG_FRAME_POINTER.
CONFIG_MAGIC_SYSRQ
啟動"magic SysRq"鍵. 我們在本章後面的"system hangs"一節查看這個鍵.
CONFIG_DEBUG_STACKOVERFLOW
CONFIG_DEBUG_STACK_USAGE
這些選項能幫助追緃內核stack overflows. stack overflow的一個明確特徵是一個沒有任何合理的back trace的oops 輸出, 第一個選項對內核增加了明確的溢出檢查; 第2 個使得內核??監測stack使用並做一些統計, 其中有一些統計可以用magic SysRq 鍵得到.
CONFIG_KALLSYMS
這個選項(在"Generl setup/Standard features"下)使得內核符號信息建在內核中; default是啟動的. 符號選項用在debug上下文中; 沒有它, 一個oops 列表只能以16 進制格式給你一個內核trackback, 這不是很有用.
CONFIG_IKCONFIG
CONFIG_IKCONFIG_PROC
這些選項(在"Generl setup"選單)使得完整的內核配置狀態被建立到內核中, 可以通過/proc 來使其可用. 大部分內核開發者知道他們使用的哪個配置, 並不需要這些選項(會使得內核更大). 但是如果你試著debug由其他人建立的內核中的問題, 它們可能有用.
CONFIG_ACPI_DEBUG
在"Power management/ACPI"下. 這個選項打開詳細的ACPI (Advanced Configuration and Power Interface) debug信息, 如果你懷疑一個問題和ACPI 相關它可能有用.
CONFIG_DEBUG_DRIVER
在"Device drivers"下. 打開了driver core的debug信息, 可用以追緃low level支持代碼的問題. 我們在第14 章查看driver core.
CONFIG_SCSI_CONSTANTS
這個選項, 在"Device drivers/SCSI device support"下, 建立詳細的SCSI 錯誤消息的信息. 如果你在使用SCSI driver, 你可能需要這個選項.
CONFIG_INPUT_EVBUG
這個選項(在"Device drivers/Input device support"下)打開輸入事件的詳細日誌. 如果你使用一個輸入設備的driver, 這個選項可能會有用. 然而要小心這個選項的安全性的隱含意義: 它記錄了你鍵入的任何東西, 包括你的密碼.
CONFIG_PROFILING
這個選項位於"Profiling support"之下. profiling通常用在系統性能調整, 但是在追緃一些內核hangs和相關問題上也有用.
當我們查看各種方法來追緃內核問題時.我們會再次遇到一些上面的選項, 但是首先, 我們要看一下經典的debug技術: print 語句.
沒有留言:
張貼留言