Chinaunix

标题: 通过串口调试FreeBSD内核的操作示例 [打印本页]

作者: 雨丝风片    时间: 2006-09-04 11:19
标题: 通过串口调试FreeBSD内核的操作示例
通过串口调试FreeBSD内核的操作示例


这个示例使用的是Windows vmware里的两台虚拟FreeBSD机器,演示通过串口调试FreeBSD内核的操作过程。内核版本为FreeBSD6.1。

1、调试环境的搭建

   首先是在vmware里面安装两台FreeBSD机器,并通过用命名管道模拟的“串口”将这两台机器连接起来,具体设置方法请参见vmware随机文档的“Connecting Two Virtual Machines ”一节。

2、FreeBSD调试内核的编译

   两台虚拟FreeBSD机器分别作为调试机和目标机。

(1)在调试机上构建自己的内核配置文件,假设名字为DEBUG_KERNEL:
  1. #cd /usr/src/sys/i386/conf
  2. #mkdir /root/kernels
  3. #cp GENERIC /root/kernels/DEBUG_KERNEL
  4. #ln -s /root/kernels/DEBUG_KERNEL
复制代码


(2)在调试机上编辑上述内核配置文件:
  1. #vim DEBUG_KERNEL
复制代码

        在配置文件中加入以下选项:
  1. makeoptions     DEBUG=-g
  2. options         KDB
  3. options         KDB_TRACE
  4. options         DDB
  5. options         GDB
复制代码


(3)在调试机上编译调试内核:
  1. #/usr/sbin/config DEBUG_KERNEL
  2. #cd ../compile/DEBUG_KERNEL
  3. #make cleandepend
  4. #make depend
  5. $make
复制代码


(4)完成上述步骤之后,在调试机的当前目录(/usr/src/sys/i386/compile/DEBUG_KERNEL/)目录下就会生成kernel.debug文件。把这个文件拷贝到目标机上,放到/boot/kernel/目录下,更名为kernel,并使用strip -x去掉其中的调试符号。

3、完成调试机和目标机的远程连接

(1)编辑目标机的/boot/device.hints文件,找到0号串口标志对应的行,为其增加0x80标志,修改后该行如下:
  1. hint.sio.0.flags="0x90"
复制代码


(2)另外,我所使用的FreeBSD6.1版本在进入DDB模式之后会失去键盘响应,这是由于DDB和kbdmux(4)共存还有问题。如果出现这一情况,解决办法是在目标机的/boot/device.hints文件中添加如下这一行:
  1. hint.kbdmux.0.disabled="1"
复制代码


(3)重启目标机,在启动菜单中选择以下这一项:
  1. 6. Escape to loader prompt
复制代码

       然后在“OK”提示符后输入boot -d :
  1. Type '?' for a list of commands, 'help' for more detailed help.
  2. OK boot -d
复制代码


       这时就会出现如下画面:
     
       然后再依次输入“gdb”和“s”命令,使其进入等待远端gdb调试连接的状态。
     

( 4 )在调试机上,输入下述命令:
  1. #kgdb -r /dev/cuad0 kernel.debug
复制代码

       稍等片刻,gdb就会完成和远端目标机的链接,出现如下画面:
  1. # kgdb -r /dev/cuad0 kernel.debug
  2. [GDB will not be able to debug user-mode threads: /usr/lib/libthread_db.so: Undefined symbol "ps_pglobal_lookup"]
  3. GNU gdb 6.1.1 [FreeBSD]
  4. Copyright 2004 Free Software Foundation, Inc.
  5. GDB is free software, covered by the GNU General Public License, and you are
  6. welcome to change it and/or distribute copies of it under certain conditions.
  7. Type "show copying" to see the conditions.
  8. There is absolutely no warranty for GDB.  Type "show warranty" for details.
  9. This GDB was configured as "i386-marcel-freebsd".
  10. Switching to remote protocol
  11. kdb_enter (msg=0x2a "") at ../../../kern/subr_kdb.c:270
  12. 270     }
  13. #0  kdb_enter (msg=0x2a "") at ../../../kern/subr_kdb.c:270
  14. 270     }
  15. (kgdb)
复制代码


4、开始调试

现在我们在调试机上用bt命令就可以看到之前的调用序列:
  1. (kgdb) bt
  2. #0  kdb_enter (msg=0x2a "") at ../../../kern/subr_kdb.c:270
  3. #1  0xc0843e92 in init386 (first=12734464) at ../../../i386/i386/machdep.c:2192
  4. #2  0xc0446ded in begin () at ../../../i386/i386/locore.s:339
  5. (kgdb)
复制代码


再设个断点试试。选择虚拟映射初始化函数vm_map_init(),设置断点,继续运行,我们就可以看到程序停止在了该函数处。然后继续使用了gdb的bt、s、list命令来测试查看调用栈、单步运行和列出源代码的功能。效果如下:
  1. (kgdb) b vm_map_init
  2. Breakpoint 1 at 0xc07c5203: file ../../../vm/vm_map.c, line 525.
  3. (kgdb) c
  4. Continuing.
  5. [New Thread 0]
  6. [Switching to Thread 0]

  7. Breakpoint 1, vm_map_init (map=0xc098b3c0, min=0, max=3217031168) at ../../../vm/vm_map.c:525
  8. 525             _vm_map_init(map, min, max);
  9. (kgdb) bt
  10. #0  vm_map_init (map=0xc098b3c0, min=0, max=3217031168) at ../../../vm/vm_map.c:525
  11. #1  0xc0628120 in proc0_init (dummy=0x0) at ../../../kern/init_main.c:430
  12. #2  0xc0627d6e in mi_startup () at ../../../kern/init_main.c:208
  13. #3  0xc0446df5 in begin () at ../../../i386/i386/locore.s:348
  14. (kgdb) s
  15. _vm_map_init (map=0xc098b3c0, min=3231233212, max=3231233212) at ../../../vm/vm_map.c:512
  16. 512             map->header.next = map->header.prev = &map->header;
  17. (kgdb) list
  18. 507      */
  19. 508     static void
  20. 509     _vm_map_init(vm_map_t map, vm_offset_t min, vm_offset_t max)
  21. 510     {
  22. 511
  23. 512             map->header.next = map->header.prev = &map->header;
  24. 513             map->needs_wakeup = FALSE;
  25. 514             map->system_map = 0;
  26. 515             map->min_offset = min;
  27. 516             map->max_offset = max;
  28. (kgdb)
复制代码


现在,我们再来看看目标机的输出信息:
   
    从图中我们可以看到,在遇到了vm_map_init()函数处的断点之后,目标机暂停在了系统初始化过程中。因此,通过这种方式,我们从系统初始化的时候就可以开始内核调试了。

[ 本帖最后由 雨丝风片 于 2006-9-4 13:24 编辑 ]
作者: congli    时间: 2006-09-04 11:24
学习ing!
作者: 雨丝风片    时间: 2006-09-04 13:16
谨以此小贴庆祝俺在cu的一周岁生日。:em11:
作者: windflying    时间: 2006-09-04 13:39
高深的东西,看不懂,顶一下雨老大!
作者: gvim    时间: 2006-09-04 15:53
大哥,3下面的(1)说的是0x80,而下面的引用hint.sio.0.flags="0x90"怎么是0x90呢。
我大概看了<<debugging kernel problems>>,不过没看出什么所以然的东西来
这些调试方法唯一的不好在于不能调试陷入gdb之前的内核代码,如mmu的初始化。
作者: 雨丝风片    时间: 2006-09-04 16:43
原帖由 gvim 于 2006-9-4 15:53 发表
大哥,3下面的(1)说的是0x80,而下面的引用hint.sio.0.flags="0x90"怎么是0x90呢。
我大概看了<<debugging kernel problems>>,不过没看出什么所以然的东西来
这些调试方法唯一的不 ...


因为我那个标志原来就是0x10,再加上一个0x80,结果就成了0x90了,呵呵。

至于这个0x10,指的是这个串口将作为串行控制台。按照【debugging kernel problems】作者的解释,是想保证在比较悲惨的情况下(比如已无法在“显示器”上看到系统状况),我们仍然能够通过传统的串行控制台看到系统的状况。不过我似乎还没有把系统折腾到这种地步过。。。

至于在begin() -> init386() -> kdb_enter() 之前的代码,不知道是否有其它方法进行调试?
作者: 大大狗    时间: 2006-09-04 16:48
嘿嘿,学习一下。

调试对我来说是用不上了,重新优化一下内核我还是可以实现的。但是就是不知道优化内核后,
会有怎么样的变化呢。我怎么感觉没有什么变化呢(我是按handbook一步一步做的)。
作者: 雨丝风片    时间: 2006-09-04 16:54
原帖由 gvim 于 2006-9-4 15:53 发表
这些调试方法唯一的不好在于不能调试陷入gdb之前的内核代码,如mmu的初始化。 ...


不过,在这之前的代码貌似不太多嘛。。。
作者: gvim    时间: 2006-09-04 17:00
原帖由 雨丝风片 于 2006-9-4 16:43 发表


因为我那个标志原来就是0x10,再加上一个0x80,结果就成了0x90了,呵呵。

至于这个0x10,指的是这个串口将作为串行控制台。按照【debugging kernel problems】作者的解释,是想保证在比较悲惨的情况下(比 ...


这样的嗦
gdb之前的代码我只调试过arm s3c2410 的NetBSD部分。我目前了解的方法只能用物理串口+printf调试。(因为在arm port里console在mmu初始化之前就初始化了)
什么时候空闲时间多就整理上来。

原帖由 大大狗 于 2006-9-4 16:48 发表
嘿嘿,学习一下。

调试对我来说是用不上了,重新优化一下内核我还是可以实现的。但是就是不知道优化内核后,
会有怎么样的变化呢。我怎么感觉没有什么变化呢(我是按handbook一步一步做的)。

我对内核tuning的所有知识都来自于http://www.netbsd.org/guide/en/chap-tuning.htmlhttp://www.freebsd.org/doc/en_US ... /config-tuning.html ,感觉NetBSD的要说的详细写,推荐你看看(抛开系统差异,这些东西原理是通的)
作者: gvim    时间: 2006-09-04 17:02
原帖由 雨丝风片 于 2006-9-4 16:54 发表


不过,在这之前的代码貌似不太多嘛。。。


这段代码是VM系统的基础,而VM又是内核里最麻烦的东西
很多VM涉及的算法、组织等都清楚,可是真要说细节还只有从这里开始
作者: 大大狗    时间: 2006-09-04 17:04
原帖由 gvim 于 2006-9-4 17:00 发表


我对内核tuning的所有知识都来自于http://www.netbsd.org/guide/en/chap-tuning.htmlhttp://www.freebsd.org/doc/en_US ... /config-tuning.html ,感觉NetBSD的要说的详细写,推荐你看看(抛开系统差异,这些东西原理是通的)   ...



嘿嘿,好谢谢,我去看看。不过不一定能看懂,我才用FB不到3个月 -.-!
作者: 大大狗    时间: 2006-09-04 17:06
怎么是英文的
作者: 雨丝风片    时间: 2006-09-04 17:11
原帖由 gvim 于 2006-9-4 17:02 发表
这段代码是VM系统的基础,而VM又是内核里最麻烦的东西
很多VM涉及的算法、组织等都清楚,可是真要说细节还只有从这里开始


,那就期待着你早点有idle时间哈!
作者: assiss    时间: 2006-09-04 17:24
原帖由 雨丝风片 于 2006-9-4 17:11 发表


,那就期待着你早点有idle时间哈!

在GUI里,idle仍然有可能造成系统缓慢。
不如gvim兄启用thread吧。
作者: 雨丝风片    时间: 2006-09-04 19:00
原帖由 assiss 于 2006-9-4 17:24 发表

在GUI里,idle仍然有可能造成系统缓慢。
不如gvim兄启用thread吧。


占用一点SLEEP状态的时间即可。
作者: linuxbao3    时间: 2006-09-05 11:07
牛人一个,很不错的教程!
作者: ktrudger    时间: 2006-09-07 14:32
雨丝风片大大写得知道文章就是详尽而清晰明了,连我这样的笨笨照着做好,实在要赞一个
另外雨斑竹为了bsd版不懈努力也值得称赞
作者: mooling    时间: 2006-09-07 17:47
真厉害啊。
作者: 雨丝风片    时间: 2006-09-07 18:26
原帖由 ktrudger 于 2006-9-7 14:32 发表
雨丝风片大大写得知道文章就是详尽而清晰明了,连我这样的笨笨照着做好,实在要赞一个
另外雨斑竹为了bsd版不懈努力也值得称赞


我水平不高,知道的也不多,不过我十分乐意把我知道的每一点东西都尽可能地写出来,以身作则地实践在此倡导的“开放的学习”。BSD内核研究的推动需要我们大家一起来努力。
作者: assiss    时间: 2006-09-07 21:09
原帖由 雨丝风片 于 2006-9-7 18:26 发表


我水平不高,知道的也不多,不过我十分乐意把我知道的每一点东西都尽可能地写出来,以身作则地实践在此倡导的“开放的学习”。BSD内核研究的推动需要我们大家一起来努力。

过度的谦虚就是骄傲。

不过雨片兄的最后一句倒是实话,不管雨片兄水平有多高,这个BSD程序开发版没我们大家的共同努力,就发展不起来。

与其它开发版块比较,BSD的开发版算是比较萧条的了。
其实从Makefile,到gcc,到库的依赖,到运行时环境的差异,更不用说内核接口的不同,BSD开发版还是有很多值得讨论的。就算这些没什么经济效益,没什么对工作上有益的参考,单是从提高我们自身的水平来讲,也值得我们参与进来。

也许我们应该对这个版的要求稍微低一些。雨片兄老惦记着内核开发,GVIM和MINGYANGUO也都是内核开发高手,是不是应该提倡一些普通的应用开发呢?这一点上l.darkfire 做得就比大家都好,他经常发一些普通开发问题(尽管有一稿多投的嫌疑)。
作者: wincat    时间: 2006-09-07 22:05
收葳ing
作者: 雨丝风片    时间: 2006-09-08 08:39
原帖由 assiss 于 2006-9-7 21:09 发表
过度的谦虚就是骄傲。

这倒不是本人的虚伪,而是我内心的真实感受。 和版内诸多兄弟比起来,我在内核方面的深度和广度显然是不够的,认清了这一事实,也好让我不断地鞭策自己去努力学习。说到学习,不得不再提一下我们在这里倡导的“开放的”学习。在BSD程序开发版立版宗旨中我谈到了关于诸葛亮和臭皮匠的问题。救世主般的诸葛亮是等不来的,现阶段只有靠我们这些皮匠们的开放互助了。

原帖由 assiss 于 2006-9-7 21:09 发表
与其它开发版块比较,BSD的开发版算是比较萧条的了。
其实从Makefile,到gcc,到库的依赖,到运行时环境的差异,更不用说内核接口的不同,BSD开发版还是有很多值得讨论的。就算这些没什么经济效益,没什么对工作上有益的参考,单是从提高我们自身的水平来讲,也值得我们参与进来。

萧条是可以想象的,可以理解的,但这恰恰应当是我们作为的理由,而不应当成为我们不作为的理由。研究东西不是逛街,哪儿热闹就往哪儿去。当初成立BSD程序开发版的主要原因就是有很多关于BSD开发的问题既不适合放在c版,也不可能放在linux的相关版块。目前大家感觉搞BSD内核和程序开发的人太少了,我觉得,资料少、高手少、门槛高是主要原因。因此,这个版块的主要任务就是积累。大家不必期望短期内这里有很高质量的产出,但只要我们每个人都把自己的心得体会写在这里,逐渐形成了积累,无形中就会降低从事BSD内核和程序开发的门槛,进门的人多了,自然就热闹了。这也正是BSD程序开发版的立版宗旨之一“基础建设”的意义所在。

原帖由 assiss 于 2006-9-7 21:09 发表
也许我们应该对这个版的要求稍微低一些。雨片兄老惦记着内核开发,GVIM和MINGYANGUO也都是内核开发高手,是不是应该提倡一些普通的应用开发呢?这一点上l.darkfire 做得就比大家都好,他经常发一些普通开发问题(尽管有一稿多投的嫌疑)。

这个问题是我的责任。当初考虑到人气问题,BSD程序开发版肩负着内核和程序开发两大职责。就其重要性而言,这两大职责不可偏废。但我本人实在是缺乏大规模的BSD软件开发的经验,只能参与一些一般问题的讨论,因此欢迎大家就如何推动这方面的讨论提出建议,同时也希望各位兄弟能够多在这里刮风下雨。。。

另,l.darkfire的一稿多投不是嫌疑,而是由来已久、铁证如山的。:em11:
作者: mingyanguo    时间: 2006-09-08 13:26
原帖由 assiss 于 2006-9-7 21:09 发表

过度的谦虚就是骄傲。

不过雨片兄的最后一句倒是实话,不管雨片兄水平有多高,这个BSD程序开发版没我们大家的共同努力,就发展不起来。

与其它开发版块比较,BSD的开发版算是比较萧条的了。
其实从Makef ...

岂敢,偶顶多是爱好者的水平。
说道萧条,主要还是国内的开发者比较少,而像delphij,davidxu他们也不到这地方来,来了也找不到多少人跟他们讨论。有问题,大家最终还是到邮件列表解决。解决萧条,是个长期的过程.萧条同时也与新加入kernel开发的人比较少有关,如果能有一批新人加入,气氛也会热闹起来的。
另外,现在大家太忙,反正我自己平时很难有空闲来bbs讨论问题,多数是灌灌水的忙里偷闲。
作者: gvim    时间: 2006-09-08 17:06
过奖,哪里是是那么高手,和顶级的BSD hacker比,我水平应该算末入流
最近看了篇文章,说BSD很大一部分的阻碍在于没有适合入门的资料,如ULK3ed, 情景分析 之于Linux。偶见stevens的 net分析却也止于网络部分。我再加上一个感觉:虽然代码注释很好,不过终究是鸟语。

如果有这样一份资料出现,应该可以吸引不少人学习BSD。毕竟BSD代码的优势在于它是一个完整的系统。
如果每个bsd team的人可以百忙中抽一点时间把自己的实现部分写点简单的设计摘要出来,相信有很大改观。否则,还是只有靠我们这些爱好者自己摸索、总结,瞎子摸象,盲人过河嘛
其实linux社区中详尽的内核资料,全球认可的也就ULK一份。不过却使很多人因此而一窥内核奥秘。

netbsd社区很久之前就在写一个 The NetBSD Internals,缺乏人手,很久没更新了。写完的话相信有很大改观。
作者: 雨丝风片    时间: 2006-09-08 17:22
一枝独放不是春,百花齐放春满园
作者: 雨丝风片    时间: 2006-09-08 17:30
原帖由 gvim 于 2006-9-8 17:06 发表
如果每个bsd team的人可以百忙中抽一点时间把自己的实现部分写点简单的设计摘要出来,相信有很大改观。否则,还是只有靠我们这些爱好者自己摸索、总结,瞎子摸象,盲人过河嘛
...


我还是比较喜欢少说话多办事的作风。与其仰着脖子等待一些不切实际的施舍,还不如把头埋下来踏踏实实地从一点一滴做起。虽然爱好者们的摸索和总结很艰难,但只要在摸索,只要在总结,那么事情总会有改观的。偶尔也会因为无意间在互联网的某个角落发现一篇BSD内核优秀资料而惊喜,但却不禁感叹这种机会的渺茫。如果大家都这么自顾自地去摸索,得到点宝贝都自己藏着,那么大家手里的宝贝也不过就那么点东西。别人得不到你的,你也得不到别人的。所以,知识需要共享,学习需要开放。改变现实当先改变风气。
作者: gvim    时间: 2006-09-08 17:35
你说得对。
我决定先把UVM设计的博士论文翻译出来,全文杂七杂八全部280来页(真正需要翻译的可能只有200页)。如果有人愿意一起那就最好不过。灭哈哈哈哈
作者: 雨丝风片    时间: 2006-09-08 17:39
原帖由 gvim 于 2006-9-8 17:35 发表
你说得对。
我决定先把UVM设计的博士论文翻译出来,全文杂七杂八全部280来页(真正需要翻译的可能只有200页)。如果有人愿意一起那就最好不过。灭哈哈哈哈


me。:em11:
作者: gvim    时间: 2006-09-08 17:47
原帖由 雨丝风片 于 2006-9-8 17:39 发表


me。:em11:


其实我期望回答我的是个美丽的学外语的22、23岁的身长170cm的长发妹妹。哪怕他一点计算机都不会。
不过既然老大回话了,我也就只能去yy了
作者: 雨丝风片    时间: 2006-09-08 17:51
原帖由 gvim 于 2006-9-8 17:47 发表
其实我期望回答我的是个美丽的学外语的22、23岁的身长170cm的长发妹妹。哪怕他一点计算机都不会。
不过既然老大回话了,我也就只能去yy了


小g,你就是改不了yy的毛病。前面已经跟你说了,与其仰着脖子等待一些不切实际的施舍,还不如把头埋下来踏踏实实地跟一个老男人一起做点正事。
作者: assiss    时间: 2006-09-08 18:04
原帖由 雨丝风片 于 2006-9-8 17:51 发表


小g,你就是改不了yy的毛病。前面已经跟你说了,与其仰着脖子等待一些不切实际的施舍,还不如把头埋下来踏踏实实地跟一个老男人一起做点正事。

我不YY,不过这次不能跟你们一起做了。我自己的论文还正在紧张写作中呢,鸟语的。
出点劳力吧,最后的PDF版我包了(不过要是能把szjungle拉进来,这最后的劳力估计都不用我出了)。
作者: gvim    时间: 2006-09-08 18:20
原帖由 assiss 于 2006-9-8 18:04 发表

我不YY,不过这次不能跟你们一起做了。我自己的论文还正在紧张写作中呢,鸟语的。
出点劳力吧,最后的PDF版我包了(不过要是能把szjungle拉进来,这最后的劳力估计都不用我出了)。


想做责任编辑?写鸟语的人不来翻译鸟语真是可惜了,我看你还是找个校审干干对翻译来说比较实际,哈哈
作者: mingyanguo    时间: 2006-09-08 18:33
FreeBSD的VM那篇也很不错,我想翻译,结果到中间停下了。想翻译好太难了,时间又少,就不了了之了.
作者: gvim    时间: 2006-09-08 18:42
原帖由 mingyanguo 于 2006-9-8 18:33 发表
FreeBSD的VM那篇也很不错,我想翻译,结果到中间停下了。想翻译好太难了,时间又少,就不了了之了.


你指的Matthew Dillon 那片?
如果是的话,delphij已经帮大家翻译好了
http://www.frontfree.net/view/article_712.html

>>>想翻译好太难了
agree!!
作者: congli    时间: 2006-09-08 19:42
原帖由 gvim 于 2006-9-8 18:42 发表


你指的Matthew Dillon 那片?
如果是的话,delphij已经帮大家翻译好了
http://www.frontfree.net/view/article_712.html

>>>想翻译好太难了
agree!!

偶门都没进
作者: mingyanguo    时间: 2006-09-11 08:29
原帖由 gvim 于 2006-9-8 18:42 发表


你指的Matthew Dillon 那片?
如果是的话,delphij已经帮大家翻译好了
http://www.frontfree.net/view/article_712.html

>>>想翻译好太难了
agree!!

good
我就是指这篇。
作者: 雨丝风片    时间: 2006-09-18 14:08
代某位同学发表在此,顺致敬意!


搭建FreeBSD 4.11内核调试环境.rar (48.91 KB, 下载次数: 99)


搭建FreeBSD 4.11内核调试环境
一、FreeBSD4.11交叉调试环境简要说明:
FreeBSD4.11提供了联机调试内核方法,它需要两台安装了FreeBSD的机器,这两台机器用串口连接起来,一台运行被调试的内核,它称为目标机,另一台则用于调试该内核,称为调试机。调试机通过串口调试目标机。也可以使用vmware代替物理的机器,在vmware里建立两个虚拟机,分别运行调试机和目标机,设置好vmware的串口,也可以进行调试。
调试机:
        提供调试环境,包含源代码及包含全部符号表的内核kernel.debug。调试机主要运行kgdb,使用FreeBSD6.1
目标机:
        运行脱去了调试信息的内核kernel。因此目标机运行FreeBSD4.11,并在启动时候使用指定的内核。

二、搭建交叉调试环境的具体方法:
如果采用vmware调试内核,则请先看第三部分,设置好两个虚拟机的串口连接。
搭建交叉调试环境的方法如下:
1.   在目标机上,执行如下命令,建立编译目录的符号链接:
cd /usr/src/sys/i386/conf
mkdir /root/kernels
cp GENERIC /root/kernels/DEBUG
ln -s /root/kernels/DEBUG
2.        配置内核:
打开内核配置文件DEBUG:
vim DEBUG
加入如下选项:
makeoptions DEBUG=-g
options  DDB
找到内核配置文件中如下一行,将0x10改为0x80:
device   sio0  at isa? port IO_COM1 flags 0x80 irq 4
3.        配置并编译内核,依次执行如下操作:
config –g DEBUG
cd ../../compile/DEBUG/
make depend
make
4.        编译完成,应该生成两个文件kernel和kernel.debug,现在要把调试环境如源代码及包含符号表的内核传输到调试机
cd /usr/src/
tar czvf sys.tgz sys
将/usr/src/sys目录打包,然后要降该文件通过ftp等手段传输到调试机
5.        在目标机,执行下述命令:
cd /usr/src/sys/compile/DEBUG
cp kernel.debug /boot/debug
cd /boot
strip –x debug
6.        重启目标机, 重启目标机,在出现菜单“F1 FreeBSD”的时候,按回车,然后输入:
boot /boot/debug
7.        待目标机启动完成后,按下ctrl+alt+esc组和键:
Debugger(“Manual escape to debugger”)
Stopped at Debugger+0x34: movb $0,0xc04c8620
db>
然后输入gdb:
Next trap will enter GDB remote protocol mode
然后输入单步跟踪命令s,这样目标机会等待调试机来连接:
db>s
8.        在调试机解开源代码,并进入源代码目录
#tar xzvf sys.tgz
#cd sys/compile/DEBUG

9.        运行如下命令调试目标内核
# kgdb -r /dev/ttyd0 kernel.debug
[GDB will not be able to debug user-mode threads: /usr/lib
/libthread_db.so: Undefined symbol "ps_pglobal_lookup"]
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public Li
cense, 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 warra
nty" for details.
This GDB was configured as "i386-marcel-freebsd".
Switching to remote protocol
Debugger (msg=0xc0440069 "manual escape to debugger" at
../../i386/i386/db_interface.c:321
321     }
There is no member named msg_rseq.
(kgdb)
设置个断点看看:
There is no member named msg_rseq.
(kgdb) b ether_input
Breakpoint 1 at 0xc0287d23: file ../../net/if_ethersubr.
c, line 559.
(kgdb) c
Continuing.
收到一个包,可以简单看一下一个包的生命周期:
Breakpoint 1, ether_input (ifp=0xc0968a00, eh=0xc0657d2c,
m=0xc0657d00) at ../../net/if_ethersubr.c:559
559             if (eh == NULL) {
(kgdb) p *eh
$7 = {ether_dhost = "&yuml;&yuml;&yuml;&yuml;&yuml;&yuml;", ether_shost = "\000\021\021&ETH;
\216\021", ether_type = 8}
(kgdb) n
571             if (ifp->if_bpf != NULL) {
(kgdb)
581             ifp->if_ibytes += m->m_pkthdr.len + sizeof
(*eh);
(kgdb)
584             if (ng_ether_input_p != NULL) {
(kgdb)
591             if (BDG_ACTIVE(ifp) ) {
(kgdb)
627             ether_demux(ifp, eh, m);
(kgdb) p ifp
$8 = (struct ifnet *) 0xc0968a00
(kgdb) p *ifp
$9 = {if_softc = 0xc0968a00, if_name = 0xc0449b61 "lnc", i
f_link = {tqe_next = 0xc096c804, tqe_prev = 0xc04cc0b0}, i
f_addrhead = {
    tqh_first = 0xc096ce00, tqh_last = 0xc0a13060}, if_pco
unt = 0, if_bpf = 0x0, if_index = 1, if_unit = 0, if_timer
= 0, if_flags = -30653,
  if_ipending = 0, if_linkmib = 0x0, if_linkmiblen = 0, if
_data = {ifi_type = 6 '\006', ifi_physical = 0 '\0', ifi_a
ddrlen = 6 '\006',
    ifi_hdrlen = 14 '\016', ifi_recvquota = 0 '\0', ifi_xmi
tquota = 0 '\0', ifi_do_not_use = 0 '\0', ifi_datalen = 80
'P', ifi_mtu = 1500, ifi_metric = 0, ifi_baudrate = 10000
000, ifi_ipackets = 183, ifi_ierrors = 0, ifi_opackets =
2, ifi_oerrors = 0, ifi_collisions = 0, ifi_ibytes = 1923
0, ifi_obytes = 120, ifi_imcasts = 182, ifi_omcasts = 1, i
fi_iqdrops = 0, ifi_noproto = 0, ifi_hwassist = 0,  ifi_un
used = 0, ifi_lastchange = {tv_sec = 0, tv_usec = 0}}, if_
multiaddrs = {lh_first = 0xc0adfe60}, if_amcount = 0, if_o
utput = 0xc028742c <ether_output>, if_start = 0xc03bf08c <
lnc_start>, _u1 = {if_done = 0, uif_capabilities = 0},  if
_ioctl = 0xc03bf644 <lnc_ioctl>, if_watchdog = 0xc03bf790
<lnc_watchdog>, _u2 = {if_poll_recv = 0, uif_capenable =
0}, if_poll_xmit = 0, if_poll_intren = 0, if_poll_slowinp
ut = 0, if_init = 0xc03bdadc <lnc_init>, if_resolvemulti =
0xc0288270 <ether_resolvemulti>, if_snd = { ifq_head = 0x
0, ifq_tail = 0x0, ifq_len = 0, ifq_maxlen = 50, ifq_drops
= 0}, if_poll_slowq = 0x0, if_prefixhead = {tqh_first = 0
x0, tqh_last = 0xc0968ad0}}
(kgdb)


三、用VMWARE调试内核:
1、        给虚拟的目标机添加串口:


然后根据vmware的添加硬件向导,添加一个串口:

在串口的属性配置时,选择重定向到命名管道:

目标机当然是服务器,因此选择“This end is the server”,并选择“The other end is a virtual machine”,这样就完成了目标机的串口配置。

2、        在虚拟的调试机上添加串口设备的方法类似,不同之处是调试机为客户端,因此命名管道属性如下:

3、
作者: zhangweizj    时间: 2006-09-20 10:38
好文。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2