Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304531
  • 博文数量: 89
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 691
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-20 16:58
文章分类

全部博文(89)

文章存档

2017年(1)

2016年(35)

2015年(53)

我的朋友

分类: LINUX

2016-08-04 10:03:05

1, 准备虚拟机
    准备2个机器freebsd(10.1)的kvm虚拟机器(bsd0, bsd1),
    其中bsd0为开发机(调试机), bsd1为测试机(目标机)
    bsd0开发机必须要装有freebsd的源码


2, 在bsd0开发机器上编译内核
2.1, 在bsd0上编译内核
  #cp /usr/src/sys/amd64/conf/GENERIC  /usr/src/sys/amd64/conf/GENERIC.my
  #vi  /usr/src/.../GENERIC.my
   makeoptions  DEBUG=-g
   options KDB
   options DDB
   options GDB
  
   device uart

   #cd /usr/src/;
   #make buildkernel KERNCONF=GENERIC.my -j 8;     #-j是使用的cpu核数
   #make installkernel KERNCONF=GENERIC.my;        #可以不需要
  
2.2, 将编译好的内核复制到bsd1上:
    #scp -r /boot/kernel   root@bsd1:/boot/kernel


3, 调试bsd0和bsd1的串口通信.
3.1, 在kvm bsd0上添加串口(tcp,  server mode):



3.2, 在kvm bsd1上添加串口(tcp, client mode):


PS:
   bsd0要先启动, bsd1后启动, 串口才能通信上

3.3, 调试串口通信
在bsd0发信息到bsd1的机器上:
bsd1: cat /dev/ttyu0
bsd0:      echo "hi" > /dev/ttyu0

可以看到bsd1输出"hi"

反之, 测试bsd1发消息到bsd0上

3.4, 设置测试机(目标机)的ttyu0为gdb调试串口
vi /boot/device.hints
hint.uart.0.flags="0xc0"


4, 在freebsd启动的时候, 进入内核模式
重启动bsd1测试机,
当bsd1重启的时:

选择3, 进入提示
输入"boot -d" , 进入kdb,
选择gdb, 切换到等待模式, 如下图:



在开发机输入"kgdb -r /dev/ttyu0 /boot/kernel/kernel",进入kgdb, 如图:


在bsd0开发机器上, 就可以调试bsd1测试机的启动过程了

5, 随时随地进入内核调试模式

当bsd1测试机启动完成后, 进入命令行模式, 输入:
#sysctl debug.kdb.enter=1
...
db > gdb

bsd1进入kgdb模式

在bsd0开发机器, 输入:
#kgdb -r /dev/ttyu0 /boot/kernel/kernel

进入kgdb调试

6, 调试内核模块(zfs.ko)

6.1, 在bsd0开发机,获取zfs.ko的text在文件中的偏移
root@bsd2:~ # objdump --section-headers /boot/kernel/zfs.ko | grep text
  0 .text         000be4d4  0000000000000000  0000000000000000  00000040  2**4

6.2, 在bsd1测试机,获取zfs.ko模块在系统内存中的偏移
root@cybsd1:~ # kldstat
Id Refs Address            Size     Name
 1   17 0xffffffff80200000 e48228   kernel
 2    1 0xffffffff81049000 1a3a0    uart.ko
 3    1 0xffffffff81212000 1557b8   zfs.ko
 4    1 0xffffffff81368000 3858     opensolaris.ko

其中, zfs.ko的text段在内存中的偏移是:0xffffffff81212000 + 00000040 = 0xffffffff81368040

6.3, 在bsd0中导入zfs的符号表:

(kgdb) add-symbol-file /boot/kernel.cy/zfs.ko 0xffffffff81212040
add symbol table from file "/boot/kernel.cy/zfs.ko" at
    .text_addr = 0xffffffff81212040
(y or n) y
Reading symbols from /boot/kernel.cy/zfs.ko...Reading symbols from /boot/kernel.cy/zfs.ko.symbols...done.
done.
(kgdb) b zfs_mkdir

接下来就可以调试zfs模块了.






阅读(1407) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~