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

            小默

            【轉(zhuǎn)】在VMware環(huán)境下使用KGDB調(diào)試Linux內(nèi)核及內(nèi)核模塊

            1:前言:
                最近幾天學(xué)習(xí)Linux-2.6平臺(tái)上的設(shè)備驅(qū)動(dòng),所以要建立內(nèi)核及內(nèi)核模塊的調(diào)試平臺(tái).雖然網(wǎng)上有很多相關(guān)教程,但多是基于2.6.26以前的通過(guò)補(bǔ)丁安裝的,過(guò)程非常復(fù)雜,而且問(wèn)題比較多.linux從 2.6.26開(kāi)始已經(jīng)集成了kgdb,只需要重新編譯2.6.26(或更高)內(nèi)核即可.kgdb安裝及模塊調(diào)試過(guò)程也遇到不少問(wèn)題,網(wǎng)上網(wǎng)下不斷的搜索與探索,才算調(diào)通.現(xiàn)在記錄下來(lái),供朋友們參考.
                首先說(shuō)一下,開(kāi)始本打算安裝kdb進(jìn)行內(nèi)核調(diào)試,后來(lái)聽(tīng)說(shuō)kdb只能進(jìn)行匯編級(jí)別的調(diào)試,所以放棄,改用kgdb.

            2: 系統(tǒng)環(huán)境:
            虛擬環(huán)境:   VMWare Workstation 5.5(英文版)
            操作系統(tǒng):   CentOS-4.6-i386(原內(nèi)核2.6.9,將會(huì)把內(nèi)核升級(jí)至2.6.26)
            注:CentOS 是RedHat的一個(gè)社區(qū)版本.
                 (由于我們采用的linux kernel 2.6.26已經(jīng)集成kgdb,kgdb再不需要單獨(dú)下載)

            3:系統(tǒng)的安裝:
            在VMWare中新建一臺(tái)計(jì)算機(jī):

            點(diǎn)擊 Next
            選中Custom 點(diǎn)擊 Next
            選中 New-Workstation 5,點(diǎn)擊Next
            選中Linux ,Version選中Other Linux 2.6.x kernel 點(diǎn)擊Next
            Virtual machine name 輸入Client(Development) 點(diǎn)擊Next
            Processors 選中 One, 點(diǎn)擊Next
            Memory 輸入256,點(diǎn)擊Next
            Network connection 選中Use network address translation(NAT) (選第一個(gè)貌似也可以) 點(diǎn)擊Next
            I/O adapter types
            SCSI Adapters 選中默認(rèn)的LSI Logic(這里如果你后面使用了SCSI格式的Disk,編譯內(nèi)核時(shí)需要添加相應(yīng)的驅(qū)動(dòng),我選擇的是IDE的硬盤(pán),kernel默認(rèn)就支持了)
            Disk 選中Create a new virtual disk 點(diǎn)擊Next
            Virtual Disk Type 選中IDE,點(diǎn)擊Next
            Disk capacity Disk size 輸入80G (下面的Allocate all disk space now不要選中,表示在真正使用才分配磁盤(pán)空間, Split disk into 2 GB files項(xiàng),可不選,如果你的系統(tǒng)分區(qū)為fat32格式,最好選中) 點(diǎn)擊Next.
            Disk file ,輸入Disk的名稱(chēng),如:disk1.vmdk ,點(diǎn)擊Finish.完成
            安裝CentOS 4.6(過(guò)程略過(guò))
            安裝完成后,關(guān)閉計(jì)算機(jī),然后Clone一臺(tái)同樣的計(jì)算機(jī).步驟如下:

            點(diǎn)擊VM->Clone
            選中默認(rèn)的From current state,點(diǎn)擊Next
            選中Create a full clone, 點(diǎn)擊Next
            Virtual Machine name 輸入Server(Targe),將克隆的機(jī)器命令為目標(biāo)機(jī).
            說(shuō)明一下,kgdb 需要兩臺(tái)計(jì)算機(jī)通過(guò)串口進(jìn)行遠(yuǎn)程調(diào)試,兩臺(tái)計(jì)算機(jī)分別為:
            Client(Development):開(kāi)發(fā)機(jī),也稱(chēng)客戶(hù)機(jī),將在該計(jì)算機(jī)上進(jìn)行程序的開(kāi)發(fā),GDB將在本計(jì)算機(jī)上運(yùn)行.用于輸入命令控制Server(target)的運(yùn)行.
            Server(Target): 目標(biāo)機(jī),也稱(chēng)服務(wù)器,就是被調(diào)試的計(jì)算機(jī),在Development機(jī)上開(kāi)發(fā)好的內(nèi)核模塊程序?qū)⒖截惖絋arget上運(yùn)行,其運(yùn)行受到Development命令的控制.
            分別為兩個(gè)系統(tǒng)增加一個(gè)串口,以"Output to named pipe"方式,其中:

            Client端選擇"this end is the client", "the other end is a virtual machine"
            Server端選擇"this end is the server", "the other end is a virtual machine"
            備注: 兩個(gè)pipe的名稱(chēng)要相同,并且選中下面的Connect at power on,及Advanced里面的Yield CPU on poll
            以后的部分,Server上的操作與Client上的操作將以不同的背景色顯示,輸入的命令將以不同的字體顏色并帶下劃線顯示.請(qǐng)注意:
            Server(Target) 輸入: cat /dev/ttyS0

            系統(tǒng)輸出的信息: hello Client(Development) 輸入: echo "hello" >/dev/ttuS0
            串口添加完成后,使用如果命令測(cè)試:
            在Server上cat /dev/ttyS0
            然后到Client上 echo "hello" > /dev/ttyS0
            這時(shí)回到Server上,如果能看到輸入的hello,說(shuō)明串口通訊正常.
            4:升級(jí)內(nèi)核2.6.26(添加關(guān)于KGDB的選項(xiàng))
                  說(shuō)明一下,這里是要升級(jí)Server的內(nèi)核,因?yàn)閗gdb是要Server上運(yùn)行的,但是編譯需要在Client完成(或者你也可以在Server上編譯,之后再拷貝到Client上),因?yàn)檎{(diào)試時(shí)Client上的gdb會(huì)用到編譯的內(nèi)核及源代碼.Client也需要升級(jí),保證Client同Server上的內(nèi)核一致,這樣Client上編譯的模塊拿到Server上加載就不會(huì)有什么問(wèn)題.

            首先下載kernel 2.6.26
                  我習(xí)慣在windows上下載,然后共享,再到linux使用smbclient連接,拷貝到Linux上.你也可以直接在linux上下載.
                  smbclient用法 : smbclient //192.168.0.100/share -Uadministrator 回車(chē)后,會(huì)提示輸入admin的密碼.之后就可以通過(guò)get獲取了 192.168.0.100是我在windows主機(jī)的IP,share為共享名,-U后面是用戶(hù)名

            編譯Kernel2.6.26

            進(jìn)入Client(Development)系統(tǒng),將linux-2.6.26.tar.bz2拷貝到/usr/src目錄下:
            cd /usr/src
            tar jxvf linux-2.6.26.tar.bz2
            ln -s linux-2.6.26 linux
            cd linux
            make menuconfig
            File System --> 下面把ext3,ext2都編譯進(jìn)內(nèi)核(就是把前面的M變成*)
            Kernel Hacking -->
                  選中Compile the kernel with frame pointers
                  選中KGDB:kernel debugging with remote gdb
                  并確認(rèn)以下兩項(xiàng)也是選中的(他們應(yīng)該默認(rèn)是選中的)
                  > kernel debugging
                  > Compile the kernel with debug info
            對(duì)于其它選項(xiàng),請(qǐng)按實(shí)際情況,或你的要求定制.
            在其它網(wǎng)友的說(shuō)明里面,會(huì)有Serial port number for KGDB等選項(xiàng),但是我使用的版本未找到這些選項(xiàng),所以忽略過(guò).
            保存退出
            make -j10 bzImage
            -j10表示使用10個(gè)線程進(jìn)行編譯.
            make modules
            編譯內(nèi)核模塊
            make modules_install
            安裝內(nèi)核模塊
            make install
            安裝內(nèi)核
            將Client系統(tǒng)中的linux-2.6.26整個(gè)目錄同步到Server上.

            在Client系統(tǒng)上運(yùn)行下列命令:
            cd /usr/src/linux  
            scp -r linux-2.6.26 root@Server(Target)IP:/usr/src/
                 系統(tǒng)會(huì)提示輸入root的密碼,輸入完了就會(huì)開(kāi)始復(fù)制文件了,(這里要注意,如果原系統(tǒng)已經(jīng)是2.6.26的內(nèi)核,可以只拷貝arch/i386/boot/bzImage,及System.map文件到Server上,然后修改/boot/grub/grub.conf,但由于我是從2.6.9升級(jí)上來(lái),所以需要將整個(gè)linux原代碼目錄拷貝到Server上進(jìn)行升級(jí))
            升級(jí)Srever系統(tǒng)的內(nèi)核
            進(jìn)入Server(Target)系統(tǒng),usr/src目錄:
            ln -s linux-2.6.26 linux  
            cd linux  
            make modules_install
            安裝內(nèi)核模塊
            make install
            安裝內(nèi)核
            安裝完成后,在/boot/目錄下會(huì)有即個(gè)新添加的文件./boot/grub/grub.conf文件也會(huì)添加一個(gè)新的啟動(dòng)項(xiàng),我的如下(行號(hào)不是文件的一部分):
             1 # grub.conf generated by anaconda
             2 #
             3 # Note that you do not have to rerun grub after making changes to this file
             4 # NOTICE:  You have a /boot partition.  This means that
             5 #          all kernel and initrd paths are relative to /boot/, eg.
             6 #          root (hd0,0)
             7 #          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
             8 #          initrd /initrd-version.img
             9 #boot=/dev/hda
            10 default=0
            11 timeout=5
            12 splashimage=(hd0,0)/grub/splash.xpm.gz
            13 hiddenmenu
            14 title CentOS (2.6.26)
            15     root (hd0,0)
            16     kernel /vmlinuz-2.6.26 ro root=/dev/VolGroup00/LogVol00
            17     initrd /initrd-2.6.26.img
            18 title CentOS-4 i386 (2.6.9-67.ELsmp)
            19     root (hd0,0)
            20     kernel /vmlinuz-2.6.9-67.ELsmp ro root=/dev/VolGroup00/LogVol00
            21     initrd /initrd-2.6.9-67.ELsmp.img
             
                   注意里面的NOTICE說(shuō)明,我的系統(tǒng)/boot是一個(gè)獨(dú)立的分區(qū),所以下面配置的文件路徑都是相對(duì)于/boot/目錄的,像 /vmlinuz-2.6.26,實(shí)際到它的絕對(duì)位置應(yīng)該是/boot/vmlinuz-2.6.26. 在你的系統(tǒng)上請(qǐng)根據(jù)實(shí)際情況處理.

            修改一下grub.conf,修改成下面這樣:
             1 # grub.conf generated by anaconda
             2 #
             3 # Note that you do not have to rerun grub after making changes to this file
             4 # NOTICE:  You have a /boot partition.  This means that
             5 #          all kernel and initrd paths are relative to /boot/, eg.
             6 #          root (hd0,0)
             7 #          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
             8 #          initrd /initrd-version.img
             9 #boot=/dev/hda
            10 default=0
            11 timeout=5
            12 splashimage=(hd0,0)/grub/splash.xpm.gz
            13 hiddenmenu
            14 title CentOS (2.6.26)
            15     root (hd0,0)
            16     kernel /vmlinuz-2.6.26 ro root=/dev/VolGroup00/LogVol00 kgdboc=ttyS0,115200
            17     initrd /initrd-2.6.26.img
            18 title CentOS (2.6.26) Wait...(kernel debug)
            19     root (hd0,0)
            20     kernel /vmlinuz-2.6.26 ro root=/dev/VolGroup00/LogVol00 kgdboc=ttyS0,115200 kgdbwait
            21     initrd /initrd-2.6.26.img
            22 title CentOS-4 i386 (2.6.9-67.ELsmp)
            23     root (hd0,0)
            24     kernel /vmlinuz-2.6.9-67.ELsmp ro root=/dev/VolGroup00/LogVol00
            25     initrd /initrd-2.6.9-67.ELsmp.img
             

            說(shuō)明:

            第一個(gè)啟動(dòng)項(xiàng)在原來(lái)的基礎(chǔ)上添加了kgdb的參數(shù)kgdboc=ttyS0,115200
            kgdboc 的意思是 kgdb over console,這里將kgdb連接的console設(shè)置為ttyS0,波特率為115200,如果不在內(nèi)核啟動(dòng)項(xiàng)中配置該參數(shù),可以在進(jìn)入系統(tǒng)后執(zhí)行命令:
            echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc   
            第二個(gè)啟動(dòng)項(xiàng),同第一個(gè)使用同一個(gè)內(nèi)核,只是添加了kgdbwait參數(shù)
            kgdbwait 使 kernel 在啟動(dòng)過(guò)程中等待 gdb 的連接。

            我的啟動(dòng)菜單如下:
            CentOS(2.6.26)
            CentOS(2.6.26)Wait...(kernel debug)
            CentOS-4 i386(2.6.9-67.ELsmp)
            調(diào)用內(nèi)核模塊,就選擇第一個(gè),如果要調(diào)試內(nèi)核啟動(dòng)過(guò)程,選擇第二個(gè).
            5.內(nèi)核調(diào)試
            重啟Server,通過(guò)啟動(dòng)菜單第二項(xiàng)CentOS(2.6.26)Wait...(kernel debug)進(jìn)入系統(tǒng). 只到系統(tǒng)出現(xiàn):

                 kgdb: Registered I/O driver kgdboc
                 kgdb: Waiting for connection from remote gdb  
            進(jìn)入Client系統(tǒng).

            cd /usr/src/linux  
            gdb vmlinux 
            啟動(dòng)gdb開(kāi)始準(zhǔn)備調(diào)試:輸出大致如下:

            GNU gdb Red Hat Linux (6.3.0.0-1.153.el4rh)
            Copyright 2004 Free Software Foundation, Inc.
            GDB is free software, covered by the GNU General Public License, and you are
            welcome to change it and/or distribute copies of it under certain conditions.
            Type "show copying" to see the conditions.
            There is absolutely no warranty for GDB.  Type "show warranty" for details.
            This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db
            library "/lib/tls/libthread_db.so.1" (gdb) set remotebaud 115200
            (gdb) target remote /dev/ttyS0
            注意:有的文章講:因?yàn)関mware的named piped不能被gdb直接使用,需要使用 socat -d -d /tmp/com_1 /dev/ttyS0轉(zhuǎn)換,然后使用轉(zhuǎn)換后的設(shè)備. socat需要自己下載安裝. 但在我的環(huán)境中,直接使用并沒(méi)有出錯(cuò).
            執(zhí)行該命令后輸出如下:
            Remote debugging using /dev/ttyS0
            kgdb_breakpoint () at kernel/kgdb.c:1674
            1674  wmb(); /*Sync point after breakpoint */
            warning: shared library handler failed to enable breakpoint看到上面的內(nèi)容說(shuō)明已經(jīng)連接成功,但Server上依然是假死狀態(tài),這時(shí)你可以像使用本地gdb一樣設(shè)置斷點(diǎn)(break),單步執(zhí)行(step),或其它命令.
            (gdb) cont
            繼續(xù)執(zhí)行,Server就繼續(xù)下面的系統(tǒng)初始化了.
            系統(tǒng)啟動(dòng)完成后的內(nèi)核調(diào)試:
                進(jìn)入Server后,執(zhí)行命令

            echo g > /proc/sysrq-trigger
            系統(tǒng)同樣會(huì)中斷,進(jìn)入假死狀態(tài),等待遠(yuǎn)程gdb的連接.KGDB可能會(huì)輸出如下信息:
            SysRq: GDB    上面的命令(echo g > /proc/sysrq-trigger)可以有一個(gè)快捷鍵(ALT-SysRq-G)代替,當(dāng)然前提是你編譯內(nèi)核時(shí)需要選中相關(guān)選項(xiàng),并且需要修改配置文件:/etc/sysctl.conf , 我用了一下,不太好用.因?yàn)橛械淖烂嫦到y(tǒng)中PrintScreen/SysRq鍵是用于截屏的.所以還是直接用命令來(lái)的好!
            我在~/.bashrc中添加了一句(添加完保存后,要執(zhí)行source ~/.bashrc應(yīng)用該配置):
            alias debug='echo g > /proc/sysrq-trigger'
            之后就可以直接輸入debug來(lái)使內(nèi)核進(jìn)入調(diào)試狀態(tài).
            Server進(jìn)入調(diào)試狀態(tài)后,轉(zhuǎn)換到Client系統(tǒng),重復(fù)上面的步驟.
            6. Linux內(nèi)核模塊(設(shè)備驅(qū)動(dòng))的調(diào)試
            編寫(xiě)內(nèi)核模塊,及Makefile
                  我使用的例子是Linux Device Driver 3中的例子scull. 你可以從這里下載LDD3的所有例子程序.

            進(jìn)入Client系統(tǒng),解壓example.tar.gz,將其中的example/scull目錄拷貝到/root/scull
            然后執(zhí)行:
            cd /root/scull  
            make 
            編譯應(yīng)該會(huì)出錯(cuò),因?yàn)長(zhǎng)inux Device Driver 3的例子程序是基于2.6.10內(nèi)核的,請(qǐng)參靠下面的說(shuō)明修改這些錯(cuò)誤:
            編譯scull驅(qū)動(dòng),完成后,scull目錄應(yīng)該多出了scull.ko及其它中間文件.
            scp scull.ko root@targetIp:/root/
            將scull.ko模塊文件拷貝到Server上.系統(tǒng)應(yīng)該會(huì)提示輸入密碼:

            root@targetIp's password:輸入正確密碼后,應(yīng)該能看到如下信息,表示復(fù)制成功了:
            scull.ko    100%  258k 258.0kb/s 00:00進(jìn)入Server系統(tǒng)輸入:
            cd /root/  
            insmod scull.ko 
            加載scull模塊.
            cat /sys/module/globalmem/sections/.text 
            顯示scull模塊的.text段地址.運(yùn)行該命令后,會(huì)返回一個(gè)16進(jìn)制的地址,如:
            0xd099a000echo g > /proc/sysrq-trigger 
            現(xiàn)在Server系統(tǒng)變成等待狀態(tài).
            再次進(jìn)入Client系統(tǒng):
            cd /usr/src/linux  
            gdb vmlinux  
            (gdb) set remotebaud 115200  
            (gdb) target remote /dev/ttyS0
            Remote debugging using /dev/ttyS0
            kgdb_breakpoint () at kernel/kgdb.c:1674
            1674  wmb(); /*Sync point after breakpoint */
            warning: shared library handler failed to enable breakpoint出現(xiàn)上面的信息表示連接成功,但此時(shí)還不可以設(shè)置斷點(diǎn).我試了N次,現(xiàn)在設(shè)置端點(diǎn)后,無(wú)論Server上對(duì)scull做什么操作,Client上的gdb都不會(huì)停止.也有人說(shuō)這是gdb的BUG,gdb無(wú)法正常解析內(nèi)核模塊的符號(hào)信息. 說(shuō)是下載kgdb網(wǎng)站上的gdbmod可以解決該問(wèn)題,但我試了之后發(fā)現(xiàn)根本沒(méi)有用. 所以只能通過(guò)命令手動(dòng)加載相關(guān)符號(hào)信息:
            (gdb) add-symbol-file /root/scull/scull.ko 0xd099a000
            注意: 0xd099a000地址是在上面獲取的,命令輸入完了,系統(tǒng)會(huì)有如下提示信息(第二行后面的y是自己輸入的:
            add symbol table from file "/root/scull/scull.ko" at .text_addr = 0xd099a000
            (y or n)y
            Reading symbols from /root/scull/scull.ko...done.        (gdb)break scull_write

            Breakpoint 1 at 0xd099a2d9: file /root/scull/main.c,line 338.(gdb)break scull_read

            Breakpoint 2 at 0xd099a1a2: file /root/scull/main.c,line 294(gdb)cont  

            ContinuingClient上的工作暫停,回到Server系統(tǒng)上:
            Server現(xiàn)在處于運(yùn)行狀態(tài),在Server上運(yùn)行下面的命令:
            cat /proc/devices | grep "scull"
            查看scull模塊分配的major.我的系統(tǒng)中返回如下:
            253 scull
            253 scullp
            253 scullamknod /dev/scull c 253 0
            253是剛才查詢(xún)到的版本號(hào).
            echo "this is a test " > /dev/scull
            測(cè)試輸入函數(shù):scull_write. 該命令輸入完成后,進(jìn)程應(yīng)該會(huì)停下來(lái), 請(qǐng)切換到Client系統(tǒng).
            cat /dev/scull
            測(cè)試輸出函數(shù):scull_read. 該命令輸入完成后,進(jìn)程應(yīng)該會(huì)停下來(lái), 請(qǐng)切換到Client系統(tǒng).
            回到Client系統(tǒng),應(yīng)該能看到gdb的輸出信息:

            Breakpoint 1, scull_write (filp=0xce5870c0,buf=0xb7f44000
                  "this is a test\nias | /usr/bin/which --tty-only --read-alias
                  --show-dot --show-tilde'\n",count=15,f_pos=0xce5c5f9c)
              at /root/scull/main.c:338
            338   {   
            (gdb)_  現(xiàn)在就可以像調(diào)試本地程序一樣調(diào)試scull.ko模塊了.
            以同樣的方法也可以調(diào)試其它函數(shù).(初始化函數(shù)暫時(shí)沒(méi)想到辦法調(diào)試,因?yàn)槭褂眠@種方法需要先加載后,才可以進(jìn)行調(diào)試)

            你可以自由使用和轉(zhuǎn)載本文檔,轉(zhuǎn)載時(shí)請(qǐng)注明出處. (jie123108@163.com)

            如果可以,我想寫(xiě)一個(gè)腳本自動(dòng)完成這個(gè)添加符號(hào)文件的過(guò)程,簡(jiǎn)化調(diào)試過(guò)程.
             
            Linux Device Driver 3rd中的scull 例程在2.6.26上編譯出錯(cuò)的問(wèn)題
            1。scripts/Makefile.build:46: *** CFLAGS was changed in "examples/scull/Makefile". Fix it to use EXTRA_CFLAGS。 停止。
                解決方法:將 Makefile 中的 CFLAGS 改為 EXTRA_CFLAGS
            2. examples/scull/main.c:17:26: error: linux/config.h: 沒(méi)有該文件或目錄
                解決方法: 將 main.c 中的這條 include 語(yǔ)句注釋掉。
            3. examples/scull/access.c: 在函數(shù)‘scull_u_open’中:    examples/scull/access.c:107: 錯(cuò)誤: 提領(lǐng)指向不完全類(lèi)型的指針
                解決方法:access.c 中添加:#include <linux/sched.h>
            4. examples/scull/access.c: 在函數(shù)‘scull_access_setup’中:
                examples/scull/access.c:355: 警告: 格式字符串不是一個(gè)字面字符串而且沒(méi)有待格式化的實(shí)參
                解決方法:將  kobject_set_name(&dev->cdev.kobj,  devinfo->name); 改為:
                               kobject_set_name(&dev->cdev.kobj, "%s", devinfo->name);
            因?yàn)?kobject_set_name 有一個(gè)像 printf 一樣的參數(shù)表。
            補(bǔ)充 : 老外作的改動(dòng)http://www.cs.fsu.edu/~baker/devices/lxr/source/2.6.25/ldd-examples/基本上已經(jīng)可以編譯了
            摘錄自: <<Linux Device Driver 3 中的代碼在 2.6.27 中編譯不能通過(guò)的問(wèn)題>>
            參考資料:
                    <<Using 2.6.26 Linux Kernel Debugger (KGDB) with VM>>
                    <<VMware環(huán)境下用kgdb調(diào)試內(nèi)核>>
                    <<Using 2.6.26 Linux Kernel Debugger (KGDB) with VM>>
             


            本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/jie12310/archive/2009/09/18/4564853.aspx

            posted on 2010-05-01 21:06 小默 閱讀(1835) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): Linux

            評(píng)論

            # re: 【轉(zhuǎn)】在VMware環(huán)境下使用KGDB調(diào)試Linux內(nèi)核及內(nèi)核模塊 2010-05-15 19:17

            精彩詳細(xì)  回復(fù)  更多評(píng)論   

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(13)

            隨筆分類(lèi)(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            色诱久久久久综合网ywww| 久久一区二区免费播放| 99久久精品日本一区二区免费| 久久夜色精品国产噜噜麻豆| 久久国产精品久久久| 亚洲国产高清精品线久久| 乱亲女H秽乱长久久久| 精品无码久久久久久久动漫| 亚洲狠狠婷婷综合久久久久| 中文字幕一区二区三区久久网站| 国产精品成人久久久| 中文精品久久久久国产网址| 久久久久亚洲av无码专区喷水| 日韩久久无码免费毛片软件| 999久久久无码国产精品| 欧美一区二区久久精品| 国内精品欧美久久精品| 国产精品一区二区久久不卡| 热RE99久久精品国产66热| 岛国搬运www久久| 99麻豆久久久国产精品免费| 久久久这里只有精品加勒比| 久久久久亚洲精品无码网址| 国内精品久久久久久久久| 国产精品久久永久免费| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 精品久久久久久成人AV| 性高湖久久久久久久久AAAAA| 99久久精品免费看国产一区二区三区| 久久久国产精品亚洲一区| 囯产精品久久久久久久久蜜桃 | 国产亚洲美女精品久久久久狼| 97精品依人久久久大香线蕉97| 狠狠色丁香婷婷久久综合五月| 亚洲欧美另类日本久久国产真实乱对白 | 婷婷久久综合| 午夜精品久久影院蜜桃| 日日狠狠久久偷偷色综合96蜜桃| 久久久久久av无码免费看大片| 亚洲国产香蕉人人爽成AV片久久| 久久夜色撩人精品国产|