0
   实践发现KDB不支持step调试功能 (本文针对的是arm CotexA9架构,各种架构的实现方式不一样,
   X86的好像已经支持,不过本人没有验证过)
1
   首先看下要调试的代码段
   1.1  C语言
   int  testPara_7(int a, int b,int c,int d, int e,int f,int g)
   {
         printk(KERN_ERR “hit one \n”);
         printk(KERN_ERR “hit two \n”);
         printk(KERN_ERR “hit three \n”);
         printk(KERN_ERR “hit four \n”);
         return 3;
   }  
   1.2  对应的汇编语言  (objdump -d vmlinux)
   c0339bf8 <testPara_7>:
   c0339bf8: e1a0c00d  mov ip, sp
   c0339bfc: e92dd800  push {fp, ip, lr, pc}
   c0339c00: e24cb004  sub fp, ip, #4 ; 0×4
   c0339c04: e59f0020  ldr r0, [pc, #32] ; c0339c2c <testPara_7+0×34>
   c0339c08: eb05bbef  bl c04a8bcc <printk>
   c0339c0c: e59f001c  ldr r0, [pc, #28] ; c0339c30 <testPara_7+0×38>
   c0339c10: eb05bbed  bl c04a8bcc <printk>
   c0339c14: e59f0018  ldr r0, [pc, #24] ; c0339c34 <testPara_7+0×3c>
   c0339c18: eb05bbeb  bl c04a8bcc <printk>
   c0339c1c: e59f0014  ldr r0, [pc, #20] ; c0339c38 <testPara_7+0×40>
   c0339c20: eb05bbe9  bl c04a8bcc <printk>
   c0339c24: e3a00003  mov r0, #3 ; 0×3
   c0339c28: e89da800  ldm sp, {fp, sp, pc}
   c0339c2c: c060bd96  .word 0xc060bd96
   c0339c30: c060bda3  .word 0xc060bda3
   c0339c34: c060bdb0  .word 0xc060bdb0
   c0339c38: c060bdbf  .word 0xc060bdbf
3
   通过分析汇编发现指令的地址都是以4的步长递增的,这种情况就比较号解决了,
   不用去根据不同的汇编指令,改变PC的值。而只需要简单的PC=PC+4即可。
4
   在Debug_core.c 增加函数如下:
   并在头文件中声明:  extern  void do_my_step(unsigned long addr);
void do_my_step(unsigned long addr)
{
     int i=0;
     for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++)
     {

if (kgdb_break[i].bpt_addr != addr)
              continue;
        //找到地址相匹配的,修改其地址值
         kgdb_break[i].bpt_addr=kgdb_break[i].bpt_addr+4;
         kgdb_break[i].state = BP_SET;
          printk(KERN_ERR “i is %d    kgdb_break[i].bpt_addr is %p\r\n”,i,  kgdb_break[i].bpt_addr);
          break;
    }                                
}
5  修改 kdb_bp.c 中的 kdb_handle_bp 函数如下:
   static void kdb_handle_bp(struct pt_regs *regs, kdb_bp_t *bp)
{
       if (KDB_DEBUG(BP))
               kdb_printf(“regs->ip = 0x%lx\n”, instruction_pointer(regs));
        //此处是新增的调用单步实现函数
      do_my_step(instruction_pointer(regs));
      /*
        * Setup single step
         */
       kdb_setsinglestep(regs);
     /*
       * Reset delay attribute
       */
      bp->bp_delay = 0;
     bp->bp_delayed = 1;
}
6
  实际应用,进入kdb模式后 ,(echo g > /proc/sysrq-trigger)
  输入ss即可实现单步模式(汇编级别的):
  kdb>bp c0339bf8    (在testPara_7函数处设置一个断点)
  kdb>go
  之后kernel运行到此函数,系统进入KDB模式,就可以进行单步调试
  kdb>ss
  ….
  与预想的一致,按两次ss即可打印出一条语句:(可通过串口及minicom观察)
  如: hit one
             hit two
             …..
7
  7.1  总的来说实现了step功能,但是还是存在一些小bug
  7.2  有时间的话,希望能够实现C语言级别的step(对我来说难度太大)
8
  kgdb_arch_handle_exception函数和自己实践,ARM结构的GKDBb,并没有
  实现step调试功能。
  曾试图去实现kgdb的step功能,由于条件及能力限制没能实现(
  kgdb需要用的一个串口通讯,调试本来也需要单独一条,但是现在只有
  一条共用的),
  int kgdb_arch_handle_exception(int exception_vector, int signo,
          int err_code, char *remcom_in_buffer,
          char *remcom_out_buffer,
          struct pt_regs *linux_regs)
  {
            unsigned long addr;
            char *ptr;
           switch (remcom_in_buffer[0]) {
                      case ‘D’:
                      case ‘k’:
                      case ‘c’:
                      ptr = &remcom_in_buffer[1];
                      if (kgdb_hex2long(&ptr, &addr))
                                    linux_regs->ARM_pc = addr;
                      else if (compiled_break == 1)
                                    linux_regs->ARM_pc += 4;

compiled_break = 0;

return 0;
 }

return -1;
 }

KDB支持单步调试功能(ARM架构)的更多相关文章

  1. 支持源码单步调试QT库编译笔记

    支持源码单步调试QT库编译笔记 编译环境:windows 10 编译工具:mingw_4_4_0 Qt源码版本:qt-everywhere-opensource-src-4.8.5(下载地址:http ...

  2. 给 Arm 生态添把火,腾讯 Kona JDK Arm 架构优化实践

    前言 Arm 架构以其兼具性能与功耗的特点,在智能终端以及嵌入式领域得到了广泛的使用,不断扩大其影响力.而在 PC 端以及数据中心,之前往往是 x86 架构在其中发挥着主要的作用.最近,随着人工智能. ...

  3. 手把手教你使用eclipse+qemu+gdb来单步调试ARM内核【学习笔记】

    平台信息:linux4.0 平台:qemu 作者:庄泽彬 说明:笨叔叔的Linux视频的笔记 一.编译linux源码 export CROSS_COMPILE=arm-linux-gnueabi- e ...

  4. Python的功能模块[4] -> pdb/ipdb -> 实现 Python 的单步调试

    pdb / ipdb 模块 / pdb / ipdb Module pdb 和 ipdb 的主要作用是用于 Python 程序的单步调试,Python 的调试可参考链接. 下面是一个简单的使用示例 i ...

  5. 最好用的koa2+mysql的RESTful API脚手架,mvc架构,支持node调试,pm2部署。

     #基于webpack构建的 Koa2 restful API 服务器脚手架    这是一个基于 Koa2 的轻量级 RESTful API Server 脚手架,支持 ES6, 支持使用TypeSc ...

  6. ARM架构解析

    ARM架构解析 (2014-11-23 21:56:53) 转载▼ 标签: francis_hao arm架构 arm核 soc 分类: MCU 先来谈一下ARM的发展史:1978年12月5日,物理学 ...

  7. Anroid逆向学习从编写so到静动态调试分析arm的一次总结

    Anroid逆向学习从编写so到静动态调试分析arm的一次总结 一.前言 最近跟着教我兄弟学逆向这篇教程学习Android逆向,在第七课后作业反复折腾了好几天,正好在折腾的时候对前面的学习总结一波,动 ...

  8. X86 架构和 ARM 架构

    1.关于x86架构 X86是一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合,X86是由Intel推出的一种复杂指令集,用于控制芯片的运行的程序,现在X86已经广泛运用到了家 ...

  9. zend+xdebug单步调试

    也允许使用第三方调试工具,今天以PHP教程形式分享如何使用zend studio配置Xdebug来调试PHP程序. 使用Xdebug在zend studio中调试PHP源码之前,请务必安装配置Xdeb ...

随机推荐

  1. WEB开发:如何用js来模拟服务器的ajax响应,不依赖服务器来编写前端代码

    一.问题的提出 目前web前端开发,主流的思路是: 1)编写静态的html文件(不使用模板技术,与服务器无关) 2)页面通过ajax与服务器交互,进行数据的传输,数据格式为json格式 这里存在一个问 ...

  2. jsp获取一个对象和list对象

    DiscHd ks = DiscHdService.getDiscHdByID(code); model.addAttribute("ks", ks); 如果传的是对象,则jsp页 ...

  3. UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

    UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...

  4. abstract 关键字-- 抽象

    代码: using System; namespace Console_Test { class Program { public abstract class MyClas { /// <su ...

  5. BZOJ 3477: [Usaco2014 Mar]Sabotage( 二分答案 )

    先二分答案m, 然后对于原序列 A[i] = A[i] - m,  然后O(n)找最大连续子序列和, 那么此时序列由 L + mx + R组成. L + mx + R = sum - n * m, s ...

  6. 信号与槽(可以与第三方库混用,首次见到QObject::destroyed的使用)

    信号与槽用于对象之间的通信.信号与槽机制是Qt的核心特性和区别于其他框架的特性. Introduction 在GUI程序中,当我们改变一个widget,经常需要其他的widget得到通知.更普遍的是, ...

  7. WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇]

    原文:WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇] 在[第2篇]中,我们深入剖析了单调(PerCall)模式下WCF对服务实例生命周期的控制,现在我们来 ...

  8. 黑龙江省第七届大学生程序设计竞赛-Heap

    描述 A heap is a full binary tree; for each node, its key is greater than its two sub-node’s key. Two ...

  9. Makefile学习(二)[第二版]

    复杂实例 #演示样例1:在上一个演示样例的基础上再添加一个可运行文件03test[改动之处已标红] .PHONY: clean all CC = gcc CFLAGS = -Wall -g BIN = ...

  10. 微信jsSDK开发

    (学习类)2015年最新微信公众平台开发 微信JSSDK开发分享功能 链接地址:http://blog.163.com/sdolove@126/blog/static/1146378852015132 ...