免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 11606 | 回复: 34
打印 上一主题 下一主题

[FreeBSD] 求助:到底如何使用gdb搭建FreeBSD 4.11内核交叉调试环境 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-28 10:21 |只看该作者 |倒序浏览
搭建交叉调试环境的方法如下:
1.打开内核配置文件,去掉“#makeoptions DEBUG=-g”开头的注释,增加选项“options DDB”, 将COM1的配置改为“device      sio0  at isa? port IO_COM1 flags 0x80 irq 4”
2.用config –g GENERIC配置内核,然后cd ../../compile/GENERIC, make depend, make
3.将kernel.debug拷贝到目标机上,改名为xyz,使用strip –x xyz脱去其中的调试符号,然后将其拷贝到/boot/xyz
4.打开/etc/ttys,在tyd0 "/usr/libexec/getty std.9600" dialup   off secure这一行的9600后加入“flags 0x80”
5.确保调试机和目标机间的串口线是连好的
6.重启目标机,在出现启动菜单“F1 FreeBSD”的时候,按“b”,输入“boot –d /boot/xyz”,显示器上立即输出如下信息:
WARNING: loader( metadata is missing!
Debugger(“Boot flags requested debugger “);
Stopped at 0x0342538:  movb $0,0xc045ae20
db>
7.在目标机db>提示符后输入gdb:
db>gdb
Next trap will enter GDB remote protocal mode
db>
8.在调试机中输入gdb –k kernel.debug,然后输入:
(kgdb) remote target /dev/cuaa0
Remote device not open
如果步骤7和8颠倒也不行,无论如何尝试,调试机总是提示“Remote device not open”,两个机器的串口和串口线肯定都是好的,连接也是对的。

论坛徽章:
0
2 [报告]
发表于 2006-08-28 10:28 |只看该作者
官方手册相应内容如下:
--------------------------------------------------------------------------------

10.6 使用远程 GDB 进行联机内核调试
  从 FreeBSD 2.2 开始提供了对这一功能的支持, 实际上,它也是一种非常灵活的方式。

  GDB 很久以前就已经支持 远程调试 了。 这是通过一种非常简单的串口线协议来实现的。与前面介绍的方法不同, 要使用这种方式, 您需要使用两台计算机。 其中一台用于提供调试环境,其中包括全部源代码, 以及一份包含全部符号的编译好的内核; 另一台则运行这一内核 (已经脱去了调试信息)。

  您应使用 config -g 来配置内核, 并在配置中加入 DDB, 并按通常的方法编译。 由于包含了调试信息,这样做得到的编译结果会很大。 将这个内核复制到目标机上, 并使用 strip -x 脱去调试符号, 并使用引导选项 -d 来启动。用于连接调试主机的目标机上, 应为调试串口设备设置 "flags 080"。 现在, 在调试机上,进入目标内核的编译目录, 并启动 gdb:

% kgdb kernel
GDB is free software and you are welcome to 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.
GDB 4.16 (i386-unknown-freebsd),
Copyright 1996 Free Software Foundation, Inc...
(kgdb)
  用下面的命令初始化远程调试会话 (如果使用的是第一个串口的话):

(kgdb) target remote /dev/cuaa0
  现在, 在目标机 (在开始设备检测之前就进入了 DDB), 输入:

Debugger("Boot flags requested debugger")
Stopped at Debugger+0x35: movb  $0, edata+0x51bc
db> gdb
  DDB 将给出响应:

Next trap will enter GDB remote protocol mode
  每次输入 gdb 时, 都会在远程 GDB 与本地 DDB 模式之间切换。 要立即触发一个 trap, 可以简单地输入 s (step)。您的 GDB 将获得目的内核的控制权:

Remote debugging using /dev/cuaa0
Debugger (msg=0xf01b0383 "Boot flags requested debugger")
    at ../../i386/i386/db_interface.c:257
(kgdb)
  您可以像使用任何其他 GDB 会话一样进行调试, 包括访问完整的内核, 在 Emacs 窗口中以 gud-模式 来执行 (这会在另一 Emacs 窗口中自动显示源代码), 等等

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
3 [报告]
发表于 2006-08-28 11:32 |只看该作者
印象中,应该有3种方法可以进入debug,
1. boot -d
2. 运行过程中,使用ctl-alt-esc
3. sysctl 一个系统变量,这个变量好像只有编译了调试选项后才会出现。
我一般都是采用ctl-atl-esc方式进入,这种方式非常方便。


在上一个帖子中,你说我的文章中有好多看不到的部分,也许是你的机器问题。我把这些相关内容粘贴到这,你再看看
options DDB
makeoptions DEBUG=-g
device sio0 at isa? port IO_COM1 flags 0x10 irq 4
device sio1 at isa? port IO_COM2 flags 0x80 irq 3

# config -d /tiny TINY ; cd /tiny; make depend;make

# gdb -k kernel.debug
(kgdb) target remote /dev/cuaa0

(kgdb) c

有关我文章的一些问题,可以直接去留言,bbs中的文章有时候不会及时看到的。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
4 [报告]
发表于 2006-08-28 11:34 |只看该作者
有关2台机器之间的串口能否通讯,可以用cat命令,一台输入,另一台输出,就可以看到能否正常通讯了

论坛徽章:
0
5 [报告]
发表于 2006-08-28 11:47 |只看该作者
刚才试验了一下,串口双向都是好的。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
6 [报告]
发表于 2006-08-28 12:47 |只看该作者
你的串口0是不是被占用了?

论坛徽章:
0
7 [报告]
发表于 2006-08-28 13:11 |只看该作者
没有别的程序占用串口。
我的机器跑vmware很慢,所以最好能不用vmware。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
8 [报告]
发表于 2006-08-28 17:13 |只看该作者
www.lemis.com/grog/Papers/Debug-tutorial/tutorial.pdf
《Debugging Kernel Problems》 第36页  Preparing to debug a kernel

估计有点不好用,我的NetBSD调试环境按照该手册的指导我没有建立起来。我是按照FAQ来做的

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
9 [报告]
发表于 2006-08-28 17:17 |只看该作者
原帖由 ktrudger 于 2006-8-28 13:11 发表
没有别的程序占用串口。
我的机器跑vmware很慢,所以最好能不用vmware。


可以试试vmware5.5,我的电脑256内存,分了64M给vm-freebsd,32M给vm-netbsd,同时开起来个人觉得资源消耗不大。(还可以看pplive)

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
10 [报告]
发表于 2006-08-28 21:35 |只看该作者
4.打开/etc/ttys,在tyd0 "/usr/libexec/getty std.9600" dialup   off secure这一行的9600后加入“flags 0x80”

这个是没有必要,你已经在内核中设置了标志。而且在这再次设置,我不清楚是不是会影响到内核。
在vmware和真实的环境是没有区别的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP