• <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)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            精品一区二区久久久久久久网站| 久久久久久一区国产精品| 久久综合狠狠综合久久97色| 国产精品欧美久久久天天影视| 狼狼综合久久久久综合网| 日韩人妻无码精品久久久不卡| 午夜精品久久久久| 一级a性色生活片久久无少妇一级婬片免费放 | 国产精品久久午夜夜伦鲁鲁| 日日躁夜夜躁狠狠久久AV| 久久精品夜夜夜夜夜久久| 久久免费的精品国产V∧| 亚洲精品无码久久久久去q| 日产精品99久久久久久| 久久丫精品国产亚洲av| 国产高潮国产高潮久久久| 欧美亚洲国产精品久久蜜芽| 国内精品免费久久影院| 久久伊人五月丁香狠狠色| 亚洲国产精品无码久久久蜜芽| 91精品国产综合久久久久久| 国产高清美女一级a毛片久久w | 免费精品久久久久久中文字幕| 亚洲人成电影网站久久| 久久久久久久久无码精品亚洲日韩 | 国产成人精品久久亚洲| 一级a性色生活片久久无| 精品无码久久久久久午夜| 精品久久久久久99人妻| 无码人妻久久一区二区三区蜜桃| 亚洲精品美女久久777777| 日韩亚洲欧美久久久www综合网| 久久无码人妻精品一区二区三区| 伊人久久大香线蕉亚洲| 99久久亚洲综合精品网站| 中文字幕精品久久| 欧美伊香蕉久久综合类网站| 欧美国产成人久久精品| 久久精品国产精品亚洲人人| 国产成人久久AV免费| 久久午夜免费视频|