本人水平有限,只是把使用过程记录下来,希望对有这方面需求的人有点参考.
基本软硬件环境描述:
基于ARM的demo板(Freescale I.MX系列),带有一个UART口和网口。
kernel 2.6.26. 已经支持了kgdb。其实24内核版本也是可以的,我已经验证过了。本人已经根据自己的公司的kernel版本制作了一个patch,但目前估计还不适合大家,等整理完后,看看是不是可以上传上来。
由于时间问题,我只能分段的逐步记录。 希望各位筒子们多支持,并给出建议。
(一) 先看看打完patch后的一些配置及基本的使用。 ^_^ 采用倒序的方法可能好些吧,先看看kgdb到底可以做什么,然后再来考虑如何的修改代码。kgdb的基本原理,众所周知了,不知道的google一下吧。26好像只支持uart的调试。 patch完成后,make menuconfig吧, 如果你看到了以下这些并把它们选上这些就可以了:
Kernel hacking -->
Kernel debugging
compile the kernel with debug info
KGDG: kernel debugging with remote gdb -->
KGDB: use kgdb over the serial console
然后就是编译内核了,编译完成后,加载启动,这里需要修改启动参数,具体的就看大家用的是什么bootloader了,不过基本都差不多吧,我用的是redboot, 增加以下几个参数设置:
"kgdboc=ttymxc0,115200 kgdbwait"
总共就是三个参数吧,kgdboc/kgdbwait/kgdbcon,这里没有用kgdbcon,如果用的话,就把这个加进去就可以了,加进去后,输出到控制台的msg就会在gdb的调试台看到了。
设置完成后,复位板子吧,如果你看到了如下的信息,kgdb就正常启动了:
"kgdb: Waiting for connection from remote gdb..."
到此,target上是启动完成了,接下来就是等待来自host的gdb client 连接请求了。
继续。上一节的内容。
客户端的连接比较简单,最好找到目标编译工具链的gdb,比如arm-linux-gdb啥的,到kernel源代码目录下运行: xx-gdb vmlinux. 接着设置一下gdb的连接.通过串口来与target通信。
gdb> target remote /dev/ttyS0
连接成功后,你可以看到一些打印消息,同时target的console上也会打印一些RSP协议的码流。ok,到此gdb client和target的 gdb stub完成的连接协议的交互,也就可以接收debug命令了,设个断点试一试吧。需要注意的是,这是在kernel初始化时被中断的,具体中断在什么位置,这个估计系统不一样还是有区别的,大家看看启动信息就知道了,你设置的断点肯定是要在这之后初始化的代码才可以的。
(二)
上一节的调试,只能完成初始化代码的debug,比如module_init之类的。接下来再说一下系统正常启动后,如何再进入调试模式,并且如何调试手动加载的module。
kgdb提供了magic_sysrq, 键值是'g'。所以系统启动后,你可以通过如下的命令再次进入到调试模式:
echo g > /proc/sysrq_trigger
这样你又可以通过host的gdb 设置断点啥的。断点已经在kernel中保存下来了,然后再回到控制台执行命令,运行到断点处,系统中断。然后又可以从gdb上调试代码了。
这段时间太忙了。来不及整理这些东西。年后再把module调试那部分加上来吧。
楼上的兄弟,我个人估计你在2.6.12上也是可以用起来的。你从2.6.26内核中把KGDB相关的代码移到你的内核中,应该问题不大的,只要把那两个UART的读写实现一下,基本就可以了。如果你的板子有两个串口相信用起来更方便。
阅读(1389) | 评论(0) | 转发(1) |