linux驱动调试小结

一、一些基础
1.驱动文件形式 --> *.ko
2.安装命令   --> insmod   卸载命令--> rmmod  都需要root权限 ,也可用modprobe
3.其他可能用到的命令:
           modinfo --  查看模块信息
           demsg  --- 查看硬件信息
           objdump---查看模块详细信息(功能很强大,具体man)
 4.关于驱动模型 及char block stream等详细信息 可以参考 Linux Device Driver 3thd
二、关于调试
 主要尝试过两种方法:打印或单步调试
  1.打印: printk 分很多级别信息,功能类似于c语言的printf, 一般来说信息打印到/var/log/messages,可通过cat命令或tail命令查看
               大多数问题都可以通过printk来解决,缺点在于不够直感
  2.调试工具: GDB ,KDB,KGDB 
     都需要编译DEBUG版本内核。
                KDB单机汇编级调试,需要单独下载kernel对应的patch,
                GDB没整明白,只知道 gdb vmlinux启动后 通过add-symobl-file增加被调试模块的符号信息
       KGDB 在2.6.*后就已缺省放在内核源码里了,其他的需要单独下载PATCH,反正我的2.6.18内核里没有(在kernel.org中,people/ark 下应该能找到2.6.18的patch,注意打patch的顺序) 查看是否有KGDB的方法是:源码路径下make menuconfig后能看到KGDB这一项。下面主要介绍2.6.18上KGDB环境的建立:
      KGDB需要两台机器配合,一个开发机,一个测试机,两台机器通过串口线连接(该线是需要处理的,具体的与window上调试驱地的一致)
      a.硬件连接性测试:在开发机上 执行 stty -ispeed 115200 -ospeed 115200 -F /dev/ttyS0
                                 在测试机上 执行 stty -ispeed 115200 -ospeed 115200 -F /dev/ttyS0
                                 在开发机上 执行 cat /dev/ttyS0    
                                 在测试机上 执行  echo "12345" < /dev/ttyS0
                                 如果在开发机上能看到 12345表示两台机器连通
        b.内核编译:在开发机上准备好内核源码及对应的KGDB patch文件(我使用的2.6.18-92.el5)
            make menuconfig   选上KGDB
            make modules     
            make modules_install  (把编译后的模块文件安装到当前系统的 /lib/moudles/××××下)
            在源码文件存放的一级目录下生成System.map文件,在arch/i386/boot下生成bzImage,把这两个文件拷贝到/boot下并重命名:
            cp System.map /boot/System.map-2.6.18-92
            cp bzImage   /boot/vmlinuz-2.6.18-92
            创建 连接: ln -s System.map-2.6.18-92  System.map
                              ln -s vmlinuz-2.6.18-92         vmlinuz
             制作initrd 文件:mkinitrd  initrd-2.6.18-92  ****(****表示make modules_install时在/lib/modules下新创建的文件夹名)
        c. 启动新编译内核
               打开/boot/grub/grub.conf,这个文件就像XP里的boot.ini一样,拷贝一份
               将对应的vmlinuz... 和 initrd...改成上面步骤中准备好的 ,同时需要增加启动参数:
                                 kgbwait kgdb8250=0,115200   (应该本试验中使用的KGDB patch中支持8250)
              这样修改后启动会进入等连接的状态,一般在开发机上,可以先不加kgdbwait kgdb8250....这个参数,从而让系统直接启动起来,这样可以判断新编译的内核是否正确。
         d.布置测试机
            在上步能够确保启动新内核后,将vmlinuz-2.6.18-92和initrd-26.18-92两个件弄到测试机上,并修改启动项以KGDB方式启动
         e.开始内核调试(注意内核调试与内核模块调试不是一个概念)
            在开发机上,源码路径下执行gdb ./vmlinux 进入GDB
             执行 set remotebaud 115200
                     target remote /dev/ttyS0
            如果成功后看到断点停在kgdb.c中 ,表示此时已经连接到测试器上
            输入 c  让测试机继续启动,可以随时按ctrl+c 停步测试器
            在ctrl+c 停止测试器后,便可在相要的地方增加断点,进行内核单步查看调试
   
         f.如果要是调试内核模块 例如某驱动模块 test.ko 需要在开发机上使用gdbmod来代替gdb工具
           gdbmod ./vmlinux 启动调试器后与gdb操作相同
           关键在于如何加裁被调试驱动模块的符号文件(没尝试成功,因为我想调试init函数,此时驱动还没加裁)
           网上搜到的是在开发机的gdbmod下使用,set s.....path 来增加符号文件路径,这样在测试机上执行insmod test.ko后 在开发机上的gdbmod就能够找到test.ko的符号文件,可是我没尝试成功,以后还要再试
===========================================================================================
1.在host启动agent-proxy
killall agent-proxy
agent-proxy 1222^1223 147.11.46.24 2006&
telnet localhost 1222

#agent-proxy 后面的IP 147.11.46.24 和端口2006 是实验室提供的数字串口.

2. 在target启动kgdb oc
On target side, register ttyS0 to kgdboc ans start kgdb session
echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc
echo g > /proc/sysrq-trigger

也可以在启动参数加入kgdbwait, 就可以在启动时等待gdb连接了.

3. 在host 启动gdb
sparc-gnu-gdb  sun4v-vmlinux-symbols
target remote localhost:1223
set debug remote 1
file  sun4v-vmlinux-symbols

你可能感兴趣的:(linux驱动调试小结)