kgdb over ethernet
2010年1月17日 04:57
最近项目需要用到kgdb,而目标机没有串口,唯一能用的就是网口。
linux 2.6.31 中默认已添加对kgdb通过串口调试的支持,但是不支持通过ethernet调试。
求助于google,得patch和文档,特将过程记录如下,以供后来者参考。
1. 下载patch
patch 下载地址:
http://kernel.org/pub/linux/kernel/people/jwessel/branches/
要调试内核的版本为 2.6.31.4, 上面提供的patch最新也只到 2.6.30
但因为kgdb在设计之初,就特意保持的与内核其它部分尽可能的独立。
所以,试试运气,下载2.6.30的patch。
http://kernel.org/pub/linux/kernel/people/jwessel/branches/kgdb_2.6.30.tar.bz2
结果也证明可以用。
2. 打patch
patch包里共有16个patch, 具体用途可参考patch开头的注释。
这里需要打上3个patch
0009-kgdb-Add-the-ability-to-schedule-a-breakpoint-via-a-.patch
0010-NET_POLL-Pass-skb-via-NET_POLL-rx-routine.patch
0011-kgdb-Implement-kgdb-over-ethernet-with-NET_POLL.patch
后两个是为添加kgdb over ethernet 的支持,但是用到了0009 patch中定义的函数。
$ patch -p1 < ~/kgdb/kgdb_2.6.30/0009-kgdb-Add-the-ability-to-schedule-a-breakpoint-via-a-.patch $ patch -p1 < ~/kgdb/kgdb_2.6.30/0010-NET_POLL-Pass-skb-via-NET_POLL-rx-routine.patch $ patch -p1 < ~/kgdb/kgdb_2.6.30/0011-kgdb-Implement-kgdb-over-ethernet-with-NET_POLL.patch
3. 修改内核选项
要将以下选项编译进内核:
CONFIG_FRAME_POINTER CONFIG_KGDB CONFIG_KGDB_SERIAL_CONSOLE CONFIG_KGDBOE CONFIG_DEBUG_INFO
同时需要将被调试机上的网卡驱动编译进内核,不能编为模块。
4. 修改内核启动参数
设置,
被调试的机器 ip 为 192.168.0.2,默认使用的端口为6443
主机 ip 为 192.168.0.1 ,默认使用的端口为6442
添加以下内容到内核启动参数:
kgdboe=@192.168.0.2/,@192.168.0.1/ kgdbwait
kgdbwait 使用内核在启动时停止,等待主机的连接。
详细参数的含义,参考官方文档:
http://kernel.org/pub/linux/kernel/people/jwessel/kgdb/ch03s04.html
5. 连接
首先将两台机器直接用网线连接起来,启动被调试的机器。
如果一切正常,它会在启动时候暂停。
这时,在主机用gdb去连接。
$ (gdb) target remote udp:192.168.0.2:6443 warning: The remote protocol may be unreliable over UDP. Some events may be lost, rendering further debugging impossible. Remote debugging using udp:192.168.0.2:6443 kgdb_breakpoint (new_kgdb_io_ops=<value optimized out>) at kernel/kgdb.c:1747 1747 wmb(); /* Sync point after breakpoint */ (gdb) c Continuing.
6. 调试注意事项
(1) 如果两台机器是在局域网内,会出现下面提示,
(gdb) target remote udp:192.168.0.2:6443
warning: The remote protocol may be unreliable over UDP.
Some events may be lost, rendering further debugging impossible.
Remote debugging using udp:10.99.22.254:6443
warning: Invalid remote reply:
Remote failure reply: E22
表现为连接成功,但不能调试。
这是因为kgdb使用的是非常简单的网络栈,局域网中各种各样的包会扰乱kgdb。
所以最好是将两台机器直接用网线连接,以避免不必要的干扰。
参考资料:
http://kernel.org/pub/linux/kernel/people/jwessel/branches/
http://kernel.org/pub/linux/kernel/people/jwessel/kgdb/index.html
http://blog.csdn.net/xianfengdesign/archive/2008/06/19/2564222.aspx