• <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ū)動模塊的調(diào)試技術(shù)總結(jié)

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

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

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

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

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

            prink 的一般用法是定義成一個公用的宏

            #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版本編譯時候去掉調(diào)試輸出的函數(shù)代碼。
            并可以通過設(shè)置makefile就可以是否輸出調(diào)試信息,缺點是修改makefile還需要重新編譯一次
            想法,如果能給模塊一個配置文件 (*.conf)那就修改配置文件就不用重新編譯,只需要卸載安裝模塊就實現(xiàn)調(diào)試信息的輸出,
            缺點是影響系統(tǒng)的性能。


            對於第二種 “文件保存調(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ū)動模塊拷貝相關(guān)的數(shù)據(jù)結(jié)構(gòu)到用戶空間, 用于查詢它們,缺點是需要用另外的程序來發(fā)出和顯示調(diào)試信息,并增加模塊的體積 。優(yōu)點是比/proc塊

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


            調(diào)試器

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

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



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


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


             使用Linux Trace Toolkit



             使用Dynamic Probes ( DProbes )

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

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

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

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

            導(dǎo)航

            統(tǒng)計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            久久精品毛片免费观看| 日韩一区二区三区视频久久| 亚洲AV日韩精品久久久久久| 无码久久精品国产亚洲Av影片| 无码AV中文字幕久久专区| 国产亚洲欧美成人久久片| 国产伊人久久| 亚洲色婷婷综合久久| 日本免费一区二区久久人人澡| 久久黄视频| 久久久久亚洲精品天堂| 99久久精品九九亚洲精品| 久久综合亚洲色HEZYO社区| 国产精品9999久久久久| 香蕉aa三级久久毛片| 97久久精品午夜一区二区| 人人狠狠综合88综合久久| 漂亮人妻被黑人久久精品| 久久国产精品免费一区| 亚洲va久久久噜噜噜久久男同| 91精品国产91久久久久久青草| 久久精品国产亚洲AV久| 国产成人精品久久一区二区三区av| 欧美亚洲国产精品久久| 成人精品一区二区久久久| 久久精品中文字幕一区| 久久精品亚洲乱码伦伦中文| 精品熟女少妇AV免费久久 | 日韩人妻无码一区二区三区久久 | 99久久免费国产精品| 囯产精品久久久久久久久蜜桃| 99久久精品国产一区二区三区| 亚洲精品无码久久久久久| 日韩久久久久中文字幕人妻| 亚洲国产精品人久久| 日本欧美久久久久免费播放网| 久久性精品| 国内精品久久久久久久久| 精品免费久久久久久久| 久久九九兔免费精品6| 亚洲七七久久精品中文国产|