Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153354
  • 博文数量: 101
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 9
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-17 08:11
文章分类
文章存档

2017年(91)

2016年(10)

我的朋友

分类: LINUX

2017-03-08 14:42:03

原文地址:ARM kernel 2.6.26 下的kgdb调试 作者:rjheng

本人水平有限,只是把使用过程记录下来,希望对有这方面需求的人有点参考. 
基本软硬件环境描述: 
基于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的读写实现一下,基本就可以了。如果你的板子有两个串口相信用起来更方便。
  • 阅读(634) | 评论(1) | 转发(0) |
    给主人留下些什么吧!~~

    JeiGiye2017-05-27 15:18:29

    问一下,有没有编译调试过4.8.1以上版本的linux内核。
    我验证到4.7.10还可以正常kgdb调试,可到4.8.1时就报内存不可读了。