• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小默

            【zz】linux內(nèi)核驅(qū)動(dòng)模塊的調(diào)試技術(shù)總結(jié)

            原文:http://www.cnitblog.com/textbox/articles/61881.html

            這些天來弄了一個(gè)簡單的驅(qū)動(dòng)模塊,后發(fā)現(xiàn)系統(tǒng)只要一卸載模塊系統(tǒng)就會(huì)死掉。到底是那里出了錯(cuò)?
            如果你只是通過printk來調(diào)試, 而沒有其他的方法去檢測(cè)錯(cuò)誤的。
            也是這個(gè)原因促使我寫驅(qū)動(dòng)模塊調(diào)試技術(shù)相關(guān)技術(shù)。要學(xué)好一個(gè)編程語言工具首先調(diào)試技術(shù)也一定同步。
            (如果linux 也能做出一個(gè)類似windows 下的 Windbg 或 Soft-ICE 那就不必那么麻煩了)
            這篇文章不是一氣呵成的,只是我在學(xué)習(xí)內(nèi)核調(diào)試的一個(gè)筆記。

            調(diào)試技術(shù)有以下幾種:

              1.用打印調(diào)試
              2.文件保存調(diào)試信息
              3.truss、strace和ltrace命令輸出信息來調(diào)試
              4.調(diào)試器來調(diào)試

            對(duì)于第一種 “用打印調(diào)試 ”
            利用函數(shù)或命令把相應(yīng)的信息輸出到console或文件內(nèi)
            這些函數(shù)有 printk , STOCLINUX 等等

            prink 的一般用法是定義成一個(gè)公用的宏

            #undef PDEBUG             /* undef it, just in case */
            #ifdef SCULL_DEBUG
               #ifdef __KERNEL__
                 
            /* This one if debugging is on, and kernel space */
                   #define PDEBUG(fmt, args) printk( KERN_DEBUG 
            "scull: " fmt, ## args)
               #
            else
                 
            /* This one for user space */
                   #define PDEBUG(fmt, args) fprintf(stderr, fmt, ## args)
               #endif
            #else
               #define PDEBUG(fmt, args) 
            /* not debugging: nothing */
            #endif

            #undef PDEBUGG
            #define PDEBUGG(fmt, args/* nothing: it's a placeholder */
            在makefile 里面添加
             
            DEBUG = y
            # Add your debugging flag (or not) to CFLAGS
            ifeq ($(DEBUG),y)
            DEBFLAGS 
            = ---D SCULL_DEBUG # "-O" is needed to expand inlines
            else
            DEBFLAGS 
            = -O2
            endif
            CFLAGS 
            += $(DEBFLAGS)

            這樣定義的宏可以在內(nèi)核模式和用戶模式在 Debug 版本下輸出調(diào)試信息,而在release版本編譯時(shí)候去掉調(diào)試輸出的函數(shù)代碼。
            并可以通過設(shè)置makefile就可以是否輸出調(diào)試信息,缺點(diǎn)是修改makefile還需要重新編譯一次
            想法,如果能給模塊一個(gè)配置文件 (*.conf)那就修改配置文件就不用重新編譯,只需要卸載安裝模塊就實(shí)現(xiàn)調(diào)試信息的輸出,
            缺點(diǎn)是影響系統(tǒng)的性能。


            對(duì)於第二種 “文件保存調(diào)試信息 ”
            內(nèi)核模式下可以使用 /proc文件系統(tǒng) 或者 seq_file 來記錄調(diào)試信息。創(chuàng)建自己的/proc文件系統(tǒng)的文件 或 seq_file 文件 并記錄相應(yīng)的調(diào)試信息,用于查詢。
            seq_file 操作可以參考 http://blog.chinaunix.net/u/12313/showart_172686.html;


            還有 用ioctl 命令。這些命令可以從驅(qū)動(dòng)模塊拷貝相關(guān)的數(shù)據(jù)結(jié)構(gòu)到用戶空間, 用于查詢它們,缺點(diǎn)是需要用另外的程序來發(fā)出和顯示調(diào)試信息,并增加模塊的體積 。優(yōu)點(diǎn)是比/proc塊

            oops消息 ,通常消息發(fā)生于引用了 NULL 指針或者使用其他不正確指針值。


            調(diào)試器

             使用 gdb
               優(yōu)點(diǎn):比較適用于用戶模式下調(diào)試程序,linux自帶無需重新安裝
               缺點(diǎn):不適合內(nèi)核模塊的調(diào)試(也可以內(nèi)核調(diào)試,利用它的遠(yuǎn)程調(diào)試功能。需要兩臺(tái)電腦)
             
              主要步驟是
              1.執(zhí)行  #gdb program
              2.執(zhí)行到mian():#start
              3.設(shè)置斷點(diǎn)
              4.調(diào)試

             具體命令使用:  參考 http://baike.baidu.com/view/639266.htm



             使用kdb
             優(yōu)點(diǎn):不需要遠(yuǎn)程調(diào)試
             缺點(diǎn):不支持源代碼級(jí)別上的調(diào)試只能使用匯編級(jí)別的調(diào)試,需要重新下載安裝包,安裝需要重新編譯內(nèi)核激活kdb


             使用 kgdb
             優(yōu)點(diǎn):可以對(duì)內(nèi)核進(jìn)行全方面的調(diào)試  (感覺有點(diǎn)類似 windows 下的WinDdg)
             缺點(diǎn):需要兩臺(tái)電腦,配置復(fù)雜 ,更新慢,到目前位置最高只能支持2.6.15.5 版本的內(nèi)核


             使用Linux Trace Toolkit



             使用Dynamic Probes ( DProbes )

             
            使用 SkyEye
             優(yōu)點(diǎn):ARM Simulator很好地結(jié)合在了一起 主要用于嵌入式驅(qū)動(dòng)開發(fā)領(lǐng)域
             缺點(diǎn):配置文件設(shè)置復(fù)雜

            使用 UML (虛擬機(jī)類似)
            優(yōu)點(diǎn):UML適合于調(diào)試那些處理與硬件無關(guān)的驅(qū)動(dòng)程序
            缺點(diǎn):UML并不適合于調(diào)試那些處理實(shí)際硬件的驅(qū)動(dòng)程序

            使用 JTAG- based debuggers
            優(yōu)點(diǎn):The JTAG (Joint Test Action Group) based debuggers are hardware assisted and powerful tools
            缺點(diǎn): but are expensive.

            posted on 2010-04-05 16:18 小默 閱讀(1179) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            久久精品国产亚洲AV电影 | 亚洲午夜久久久久妓女影院| 久久精品中文无码资源站| 欧美一区二区三区久久综合 | 日本人妻丰满熟妇久久久久久| 亚洲中文字幕无码一久久区| 久久久久成人精品无码中文字幕 | 久久国产三级无码一区二区| 人妻少妇久久中文字幕| 欧美熟妇另类久久久久久不卡| 成人精品一区二区久久| 99久久久国产精品免费无卡顿 | 久久天天躁狠狠躁夜夜avapp| 久久99精品久久久久久野外| 伊人久久精品无码av一区| 久久综合给合久久狠狠狠97色69| 久久精品国产亚洲AV不卡| 2021最新久久久视精品爱 | 久久精品国产亚洲AV香蕉| 久久久精品人妻一区二区三区四| 欧美激情精品久久久久久| 亚洲一区二区三区日本久久九| 国产精品久久99| 66精品综合久久久久久久| 亚洲中文字幕久久精品无码APP | 香蕉久久影院| 久久综合亚洲欧美成人| 人妻无码久久精品| 久久久久亚洲精品男人的天堂| 久久久久久a亚洲欧洲aⅴ| 久久精品国产99久久香蕉| 久久精品无码专区免费东京热| 性欧美大战久久久久久久| 激情综合色综合久久综合| 国产精品成人99久久久久91gav| 国产成人无码久久久精品一| 久久久久亚洲Av无码专| 久久精品水蜜桃av综合天堂 | 精品无码久久久久久国产| 久久99精品久久久久久水蜜桃| 国内精品久久久久国产盗摄|