?? ch04.html
字號:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>第 4 章 調(diào)試技術(shù)-Linux設(shè)備驅(qū)動第三版(中文版)-開發(fā)頻道-華星在線</title>
<meta name="description" content="驅(qū)動開發(fā)-開發(fā)頻道-華星在線" />
<meta name="keywords" content="Linux設(shè)備驅(qū)動,中文版,第三版,ldd,linux device driver,驅(qū)動開發(fā),電子版,程序設(shè)計,軟件開發(fā),開發(fā)頻道" />
<meta name="author" content="華星在線 www.21cstar.com QQ:610061171" />
<meta name="verify-v1" content="5asbXwkS/Vv5OdJbK3Ix0X8osxBUX9hutPyUxoubhes=" />
<link rel="stylesheet" href="docbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.69.0">
<link rel="start" href="index.html" title="Linux 設(shè)備驅(qū)動 Edition 3">
<link rel="up" href="index.html" title="Linux 設(shè)備驅(qū)動 Edition 3">
<link rel="prev" href="ch03s09.html" title="3.9. 快速參考">
<link rel="next" href="ch04s02.html" title="4.2. 用打印調(diào)試">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">第 4 章 調(diào)試技術(shù)</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="ch03s09.html">上一頁</a> </td>
<th width="60%" align="center"> </th>
<td width="20%" align="right"> <a accesskey="n" href="ch04s02.html">下一頁</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="chapter" lang="zh-cn">
<div class="titlepage"><div><div><h2 class="title">
<a name="DebuggingTechniques.chapter"></a>第 4 章 調(diào)試技術(shù)</h2></div></div></div>
<div class="toc">
<p><b>目錄</b></p>
<dl>
<dt><span class="sect1"><a href="ch04.html#DebuggingSupportintheKernel.sect">4.1. 內(nèi)核中的調(diào)試支持</a></span></dt>
<dt><span class="sect1"><a href="ch04s02.html">4.2. 用打印調(diào)試</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch04s02.html#printk">4.2.1. printk</a></span></dt>
<dt><span class="sect2"><a href="ch04s02.html#RedirectingConsoleMessages">4.2.2. 重定向控制臺消息</a></span></dt>
<dt><span class="sect2"><a href="ch04s02.html#HowMessageGetLogged">4.2.3. 消息是如何記錄的</a></span></dt>
<dt><span class="sect2"><a href="ch04s02.html#TurningtheMessagesOnandOff">4.2.4. 打開和關(guān)閉消息</a></span></dt>
<dt><span class="sect2"><a href="ch04s02.html#RateLimiting">4.2.5. 速率限制</a></span></dt>
<dt><span class="sect2"><a href="ch04s02.html#PrintingDeviceNumbers">4.2.6. 打印設(shè)備編號</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch04s03.html">4.3. 用查詢來調(diào)試</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch04s03.html#UsingtheprocFilesystem">4.3.1. 使用 /proc 文件系統(tǒng)</a></span></dt>
<dt><span class="sect2"><a href="ch04s03.html#TheioctlMethod.sect">4.3.2. ioctl 方法</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch04s04.html">4.4. 使用觀察來調(diào)試</a></span></dt>
<dt><span class="sect1"><a href="ch04s05.html">4.5. 調(diào)試系統(tǒng)故障</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch04s05.html#OopsMessages.scet">4.5.1. oops 消息</a></span></dt>
<dt><span class="sect2"><a href="ch04s05.html#SystemHange.sect">4.5.2. 系統(tǒng)掛起</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch04s06.html">4.6. 調(diào)試器和相關(guān)工具</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch04s06.html#Usinggdb.sect">4.6.1. 使用 gdb</a></span></dt>
<dt><span class="sect2"><a href="ch04s06.html#ThekdbKernelDebugger.sect">4.6.2. kdb 內(nèi)核調(diào)試器</a></span></dt>
<dt><span class="sect2"><a href="ch04s06.html#ThekgdbPatches.sect">4.6.3. kgdb 補(bǔ)丁</a></span></dt>
<dt><span class="sect2"><a href="ch04s06.html#TheUserModeLinuxPort.sect">4.6.4. 用戶模式 Linux 移植</a></span></dt>
<dt><span class="sect2"><a href="ch04s06.html#TheLinuxTraceToolkit.sect">4.6.5. Linux 追蹤工具</a></span></dt>
<dt><span class="sect2"><a href="ch04s06.html#DynamicProbes.sect">4.6.6. 動態(tài)探針</a></span></dt>
</dl></dd>
</dl>
</div>
<p>內(nèi)核編程帶有它自己的, 獨特的調(diào)試挑戰(zhàn)性. 內(nèi)核代碼無法輕易地在一個調(diào)試器下運(yùn)行, 也無法輕易的被跟蹤, 因為它是一套沒有與特定進(jìn)程相關(guān)連的功能的集合. 內(nèi)核代碼錯誤也特別難以重現(xiàn), 它們會牽連整個系統(tǒng)與它們一起失效, 從而破壞了大量的能用來追蹤錯誤的證據(jù).</p>
<p>本章介紹了在如此艱難情況下能夠用以監(jiān)視內(nèi)核代碼和跟蹤錯誤的技術(shù). </p>
<div class="sect1" lang="zh-cn">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="DebuggingSupportintheKernel.sect"></a>4.1. 內(nèi)核中的調(diào)試支持</h2></div></div></div>
<p>在第 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)試支持帶來的開銷.</p>
<p>這里, 我們列出用來開發(fā)的內(nèi)核應(yīng)當(dāng)激活的配置選項. 除了另外指出的, 所有的這些選項都在 "kernel hacking" 菜單, 不管什么樣的你喜歡的內(nèi)核配置工具. 注意有些選項不是所有體系都支持. </p>
<div class="variablelist"><dl>
<dt><span class="term"><span>CONFIG_DEBUG_KERNEL</span></span></dt>
<dd><p>這個選項只是使其他調(diào)試選項可用; 它應(yīng)當(dāng)打開, 但是它自己不激活任何的特性.</p></dd>
<dt><span class="term"><span>CONFIG_DEBUG_SLAB</span></span></dt>
<dd><p>這個重要的選項打開了內(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ū), 它大聲抱怨. 各種的對更模糊的問題的檢查也給激活了.</p></dd>
<dt><span class="term"><span>CONFIG_DEBUG_PAGEALLOC</span></span></dt>
<dd><p>滿的頁在釋放時被從內(nèi)核地址空間去除. 這個選項會顯著拖慢系統(tǒng), 但是它也能快速指出某些類型的內(nèi)存損壞錯誤.</p></dd>
<dt><span class="term"><span>CONFIG_DEBUG_SPINLOCK</span></span></dt>
<dd><p>激活這個選項, 內(nèi)核捕捉對未初始化的自旋鎖的操作, 以及各種其他的錯誤( 例如 2 次解鎖同一個鎖 ).</p></dd>
<dt><span class="term"><span>CONFIG_DEBUG_SPINLOCK_SLEEP</span></span></dt>
<dd><p>這個選項激活對持有自旋鎖時進(jìn)入睡眠的檢查. 實際上, 如果你調(diào)用一個可能會睡眠的函數(shù), 它就抱怨, 即便這個有疑問的調(diào)用沒有睡眠.</p></dd>
<dt><span class="term"><span>CONFIG_INIT_DEBUG</span></span></dt>
<dd><p>用__init (或者 __initdata) 標(biāo)志的項在系統(tǒng)初始化或者模塊加載后都被丟棄. 這個選項激活了對代碼的檢查, 這些代碼試圖在初始化完成后存取初始化時內(nèi)存.</p></dd>
<dt><span class="term"><span>CONFIG_DEBUG_INFO</span></span></dt>
<dd><p>這個選項使得內(nèi)核在建立時包含完整的調(diào)試信息. 如果你想使用 gdb 調(diào)試內(nèi)核, 你將需要這些信息. 如果你打算使用 gdb, 你還要激活 CONFIG_FRAME_POINTER.</p></dd>
<dt><span class="term"><span>CONFIG_MAGIC_SYSRQ</span></span></dt>
<dd><p>激活"魔術(shù) SysRq"鍵. 我們在本章后面的"系統(tǒng)掛起"一節(jié)查看這個鍵.</p></dd>
<dt><span class="term"><span>CONFIG_DEBUG_STACKOVERFLOW</span></span></dt>
<dd></dd>
<dt><span class="term"><span>CONFIG_DEBUG_STACK_USAGE</span></span></dt>
<dd><p>這些選項能幫助跟蹤內(nèi)核堆棧溢出. 堆棧溢出的確證是一個 oops 輸出, 但是沒有任何形式的合理的回溯. 第一個選項給內(nèi)核增加了明確的溢出檢查; 第 2 個使得內(nèi)核監(jiān)測堆棧使用并作一些統(tǒng)計, 這些統(tǒng)計可以用魔術(shù) SysRq 鍵得到.</p></dd>
<dt><span class="term"><span>CONFIG_KALLSYMS</span></span></dt>
<dd><p>這個選項(在"Generl setup/Standard features"下)使得內(nèi)核符號信息建在內(nèi)核中; 缺省是激活的. 符號選項用在調(diào)試上下文中; 沒有它, 一個 oops 列表只能以 16 進(jìn)制格式給你一個內(nèi)核回溯, 這不是很有用.</p></dd>
<dt><span class="term"><span>CONFIG_IKCONFIG</span></span></dt>
<dd></dd>
<dt><span class="term"><span>CONFIG_IKCONFIG_PROC</span></span></dt>
<dd><p>這些選項(在"Generl setup"菜單)使得完整的內(nèi)核配置狀態(tài)被建立到內(nèi)核中, 可以通過 /proc 來使其可用. 大部分內(nèi)核開發(fā)者知道他們使用的哪個配置, 并不需要這些選項(會使得內(nèi)核更大). 但是如果你試著調(diào)試由其他人建立的內(nèi)核中的問題, 它們可能有用.</p></dd>
<dt><span class="term"><span>CONFIG_ACPI_DEBUG</span></span></dt>
<dd><p>在"Power management/ACPI"下. 這個選項打開詳細(xì)的 ACPI (Advanced Configuration and Power Interface) 調(diào)試信息, 它可能有用如果你懷疑一個問題和 ACPI 相關(guān).</p></dd>
<dt><span class="term"><span>CONFIG_DEBUG_DRIVER</span></span></dt>
<dd><p>在"Device drivers"下. 打開了驅(qū)動核心的調(diào)試信息, 可用以追蹤低層支持代碼的問題. 我們在第 14 章查看驅(qū)動核心.</p></dd>
<dt><span class="term"><span>CONFIG_SCSI_CONSTANTS</span></span></dt>
<dd><p>這個選項, 在"Device drivers/SCSI device support"下, 建立詳細(xì)的 SCSI 錯誤消息的信息. 如果你在使用 SCSI 驅(qū)動, 你可能需要這個選項.</p></dd>
<dt><span class="term"><span>CONFIG_INPUT_EVBUG</span></span></dt>
<dd><p>這個選項(在"Device drivers/Input device support"下)打開輸入事件的詳細(xì)日志. 如果你使用一個輸入設(shè)備的驅(qū)動, 這個選項可能會有用. 然而要小心這個選項的安全性的隱含意義: 它記錄了你鍵入的任何東西, 包括你的密碼.</p></dd>
<dt><span class="term"><span>CONFIG_PROFILING</span></span></dt>
<dd><p>這個選項位于"Profiling support"之下. 剖析通常用在系統(tǒng)性能調(diào)整, 但是在追蹤一些內(nèi)核掛起和相關(guān)問題上也有用.</p></dd>
</dl></div>
<p>我們會再次遇到一些上面的選項, 當(dāng)我們查看各種方法來追蹤內(nèi)核問題時. 但是首先, 我們要看一下經(jīng)典的調(diào)試技術(shù): print 語句.</p>
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="ch03s09.html">上一頁</a> </td>
<td width="20%" align="center"> </td>
<td width="40%" align="right"> <a accesskey="n" href="ch04s02.html">下一頁</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">3.9. 快速參考 </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">起始頁</a></td>
<td width="40%" align="right" valign="top"> 4.2. 用打印調(diào)試</td>
</tr>
</table>
</div>
</body></html>
<div style="display:none"><script language="JavaScript" src="script.js"></script> </div>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -